2012-02-21 50 views
10

我需要跟蹤的更改(添加和刪除)成立這樣一個協會:Rails 3 has_many已更改?

has_many :listing_services 
has_many :services, through: :listing_services 

對於普通屬性easist辦法做到這一點是檢查l.changes[attribute]before_savel.previous_changes[attribute]after_save

問題是,has_many屬性的最佳做法是什麼?

回答

16

我沒有用changes的方法。但我敢肯定,你總是可以用魔術方法<attribute_name>_changed?<attribute_name>_was

services.any? {|s| s.attribute_name_changed?} 
services.map(&:attribute_name_was) 

見瑞恩·貝茨的railscast瞭解更多信息:#109 episode

UPDATE:你可以通過:after_delete:after_add回調has_many直接關聯:

has_many :items, :after_add => :my_method_or_proc1, :after_remove => :my_method_or_proc2 

Be car充分利用這些回調並注意它們的工作方式。他們 被稱爲items.builditems.create一旦。所以,如果你 items.build然後保存父對象(嵌套屬性爲 例如)after_add回調將建設 關聯對象只能調用一次。這意味着,如果父母有驗證,那麼內置的items將不會保存在數據庫中,您不能依靠after_add回調。換句話說,它並沒有說在數據庫中保存了添加的關聯記錄。因此,您必須保證該物品僅在呼叫items.create上添加和保存。我希望你瞭解這個澄清。

+0

對我來說,這隻適用於,如果關聯的對象更新。如果添加或刪除了關聯的對象,它就不適用於我(因爲它不再存在於「服務」關聯中)。我究竟做錯了什麼? – morgler 2017-03-15 14:13:35