Rails - 保存记录时自动更新外键

时间:2013-10-13 02:19:48

标签: ruby-on-rails foreign-keys

我有两个ActiveRecord模型,AssignmentInstructionAssignment属于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结构的情况下无法相互通信。但实际上还可以吗?

2 个答案:

答案 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。

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