2012-02-21 43 views
10

Ben değişikliklerini izlemek gerekir (eklemeler ve silmeler) bu kadarını dernek:Raylar 3 has_many değişti?

has_many :listing_services 
has_many :services, through: :listing_services 

Normal öznitelikler için bu after_save içinde before_save veya l.previous_changes[attribute] yılında l.changes[attribute] kontrol etmektir yapmak Easist yolu.

Soru, has_many öznitelikleri için bunu yapmanın en iyi yolu nedir?

cevap

16

changes yöntemini kullanmamıştım. Ama hep sihirli yöntemler <attribute_name>_changed? ve <attribute_name>_was kullanabilirsiniz eminim:

services.any? {|s| s.attribute_name_changed?} 
services.map(&:attribute_name_was) 
fazla bilgi için

bakınız Ryan Bates railscast: #109 episode

GÜNCELLEME: Sen :after_delete geçmek ve has_many için :after_add geri aramaları yapabilirsiniz ilişkilendirme doğrudan:

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

Bu geri bildirimleri kullanarak eful ve nasıl çalıştıklarına dikkat edin. Onlar Onlar bir kez items.build ve items.createçağrılır. after_add geri arama ilişkili nesne oluşturmaya yalnızca bir kez çağrılır Yani items.build ararsanız ve sonra ( örneğin iç içe niteliklere sahip) ana nesneyi kaydedin. Ebeveyn doğrulama varsa o zaman items inşa veritabanında kaydedilir ve after_add geri arama güvenemezsiniz anlamına gelir. Başka bir deyişle, eklenen ilişkilendirmenin kaydının DB'ye kaydedildiğini söylemez. Dolayısıyla, öğenin eklendiğini ve yalnızca items.create numaralı telefondan kaydedildiğini garanti edersiniz. Umarım bu açıklamayı anlarsınız.

+0

Benim için yalnızca ilgili nesne güncellenmişse çalışır. İlişkili nesne eklendiyse veya kaldırılırsa, benim için çalışmaz (o zamandan beri "services" ilişkisinde artık yoktur). Neyi yanlış yapıyorum? – morgler