0

我有两个 ActiveRecord 模型,AssignmentInstruction. Assignment属于Instruction.

保存新分配时,我想触发一个回调,该回调将外键插入分配中,基于Assignment. 换句话说,如果assignment.assignment_type= instruction.name,则将该指令的 id 作为主键插入到赋值中。

看起来你会使用 Rails 回调。但我不确定如何在不让模型相互交谈的情况下做到这一点,我认为这是一个坏主意。

编辑 1

按照下面 mjnissim 的建议,我实现了这个,它有效:

class Assignment < ActiveRecord::Base
  attr_accessible :game_type, :title, :instruction_id

  belongs_to :instruction

  before_save :set_instruction

  private

  def set_instruction
    instruction = Instruction.where(:name => self.game_type).first
    self.instruction = instruction
  end

end

但是,我对编写该set_instruction方法犹豫不决,因为我认为如果不破坏 MVC 结构,模型就无法相互交流。但实际上没问题吗?

4

2 回答 2

1

如果分配belongs_to指令,则分配具有instruction_id属性。设置instruction_id你只需要

assignment.instruction = instruction
于 2013-10-13T15:03:43.833 回答
0

漂亮,

模型相互了解或使用回调并不是一个坏主意。这是个好主意。

但是,我没有完全理解你的问题兄弟。您是否每条指令只有一项作业?

无论如何,可以在此页面上找到很多回调,但我认为您正在寻找的是before_save. 尝试将其放入Assignment模型中:

before_save do
  if some_condition_is_true
    assign_this = to_that
  end
  true
end

注意true最后的。如果您不返回true,它可以取消某些回调中的保存(阅读我链接到的文档以找出哪个)。(不用说 - 您有时可能需要取消保存,因此请正确使用...)

您可能希望在回调中使用的另一个有用的东西是_changed?. 例如,如果你有一个名为的属性title,你可以这样问:

if title_changed?
  ... do things...
end

_changed?免费提供,内置于 Rails 中。

如果您需要澄清,请发表评论,我会尝试更新我的答案。

于 2013-10-13T18:14:25.653 回答