只有在Rails中的属性发生变化时才运行callback

我在我的应用程序中有以下关联:

# Page belongs_to :status 

我希望在pagestatus_id发生变化时运行callback。

所以,如果page.status_id从4到5,我想能够抓住这一点。

怎么做?

 class Page < ActiveRecord::Base before_save :do_something, if: :status_id_changed? private def do_something # ... end end 

这利用了before_savecallback可以基于方法调用的返回值有条件地执行的事实。 status_id_changed? 方法来自ActiveModel :: Dirty ,它允许我们通过简单地追加_changed?来检查一个特定的属性是否已经改变_changed? 到属性名称。

当应该调用do_something方法时,可以满足您的需求。 它可能是before_saveafter_save或任何定义的ActiveRecord ::callback 。

尝试这个

 after_validation :do_something, if: ->(obj){ obj.status_id.present? and obj.status_id_changed? } def do_something # your code end 

参考 – http://apidock.com/rails/ActiveRecord/Dirty