来自不同型号的ActiveRecord回调设置

时间:2010-09-20 12:56:14

标签: ruby-on-rails activerecord

假设我必须使用简单模型FirstSecondSecond使用belongs_to :first建立一对一的关系。现在,我希望在保存Second时使用First执行某些操作。但我不想在after_save设置First回调来处理Second

我想让我的模特保持清洁,并尽可能不知道彼此。我总是遵循对象封装的最佳实践,它总是让我的生活更轻松。

很自然,由于after_save是一种类方法,我尝试在Second中设置此回调,如下所示:

class Second < ActiveRecord::Base

  belongs_to :first

  First.after_save do |record|
    if that = Second.find_by_first_id(record.id)
      # grow magic mushrooms here...
    end
  end
end

但这不起作用,永远不会执行回调,也不会引发错误。

3 个答案:

答案 0 :(得分:4)

你可以通过观察者来做:

class FirstObserver < ActiveRecord::Observer
  def after_save(first)
    ...
  end
end

不要忘记在config/application.rb中启用观察者:

config.active_record.observers = :first_observer

答案 1 :(得分:3)

最好设置observer,类似“FirstObserver”,并在那里写一个保存后的回调。

答案 2 :(得分:0)

试试这个:

First.class_eval do
  def after_save record
     #mashrooooms
  end
end