我有两个ActiveRecord模型,Assignment
和Instruction
。 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结构的情况下无法相互通信。但实际上还可以吗?
答案 0 :(得分:1)
如果分配belongs_to
说明,则分配具有instruction_id
属性。要设置instruction_id
,您只需要
assignment.instruction = instruction
答案 1 :(得分:0)
妙的,
了解彼此或使用回调的模型并不是一个坏主意。这是一个好主意。
但是,我并没有完全理解你的问题。每个教学只有一个作业吗?
无论如何,有很多回调可以找到on this page,但我认为你要找的是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。
如果您需要澄清,请发表评论,我会尝试更新我的答案。