适用于所有型号的ActiveRecord全局回调

我的RoR应用程序中有大约40个模型。 我想为所有模型设置一个after_save回调。 一种方法是将其添加到所有模型中。 由于此回调具有相同的代码,因此有一种方法可以全局定义它,以便为所有模型调用它。

我试了这个没有运气:

class ActiveRecord::Base after_save :do_something def do_something # .... end end 

如果我在单个模型中执行相同的代码。

谢谢,伊姆兰

您应该使用观察者:

 class AuditObserver < ActiveRecord::Observer observe ActiveRecord::Base.send(:subclasses) def after_save(record) AuditTrail.new(record, "UPDATED") end end 

要激活观察者,请在config / application.rb文件的config.active_record.observers配置设置中列出。

 config.active_record.observers = :audit_observer 

注意

在Rails 4中,观察者function从核心移除。 使用https://github.com/rails/rails-observers gem。

我在这个问题上已经很晚了,但是如果其他人正在使用Rails 3并且发现了这个,那么这个响应可能有所帮助。

加载观察者时可能无法加载某些模型。 文档说您可以覆盖observed_classes,这样您就可以动态获取活动记录的子类。

 class AuditObserver < ActiveRecord::Observer def self.observed_classes ActiveRecord::Base.send(:subclasses) end end 

这似乎对我有用:

 ActiveRecord::Base.after_save do ... end 

我有没有看到问题?

根据@ harish的答案和答案( https://stackoverflow.com/a/10712838/2226338 ):

 class AuditObserver < ActiveRecord::Observer Rails.application.eager_load! observe ActiveRecord::Base.descendants def after_save(record) ... end end 

这在2.3.8中对我来说非常有效:

 class AudiObserver < ActiveRecord::Observer observe :'ActiveRecord::Base' # # observe methods... # end