适用于所有型号的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