我有两个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结构的情况下,模型之间无法相互对话。但这真的可以吗?
好漂亮
模型彼此了解或使用回调不是一个坏主意。这是个好主意。
但是,我不完全理解您的问题。每条指令您只有一份作业吗?
无论如何,在此页面上可以找到很多回调,但是我认为您正在寻找的是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中。
如果您需要澄清,请发表评论,我将尝试更新我的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句