我在我的應用程序下面已經改:只運行一個回調,如果一個屬性Rails中
# Page
belongs_to :status
我想運行一個回調隨時一page
的status_id
發生了變化。
所以,如果page.status_id
從4到5,我想能夠抓住這一點。
如何做?
我在我的應用程序下面已經改:只運行一個回調,如果一個屬性Rails中
# Page
belongs_to :status
我想運行一個回調隨時一page
的status_id
發生了變化。
所以,如果page.status_id
從4到5,我想能夠抓住這一點。
如何做?
class Page < ActiveRecord::Base
before_save :do_something, if: :status_id_changed?
private
def do_something
# ...
end
end
這利用的事實before_save
回調可以基於一個方法調用的返回值有條件地執行。 status_id_changed?
方法來自ActiveModel::Dirty,它允許我們通過簡單地將_changed?
附加到屬性名稱來檢查特定屬性是否已更改。
當do_something
方法應該被調用是符合您的需求的。它可以是before_save
或after_save
或the defined ActiveRecord::Callbacks中的任何一個。
試試這個
after_validation :do_something, if: ->(obj){ obj.status_id.present? and obj.status_id_changed? }
def do_something
# your code
end
attribute_changed?
它在Rails 5.1中已被棄用,現在只需使用will_save_change_to_attribute?
。
欲瞭解更多信息:
是否''_changed爲Rails 4和高達仍然有效? – Breno
@Breno是的。 http://api.rubyonrails.org/classes/ActiveModel/Dirty.html – pdobb
此解決方案在較新版本中已棄用。 –