2012-02-21 7 views
10

मैं परिवर्तनों को ट्रैक करने की जरूरत है (यह जोड़ और हटा देता है) एक संघ इस तरह की स्थापना की:रेल 3 है_मैनी बदल गई है?

has_many :listing_services 
has_many :services, through: :listing_services 

सामान्य विशेषताओं के लिए यह after_save में before_save या l.previous_changes[attribute] में l.changes[attribute] जाँच करने के लिए है करने के लिए easist रास्ता।

सवाल यह है कि 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

अद्यतन: आप :after_delete पारित कर सकते हैं, और has_many करने के लिए :after_add कॉलबैक एसोसिएशन सीधे:

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

कार बनें इन कॉलबैक का उपयोग करके ईफुल करें और ध्यान दें कि वे कैसे काम करते हैं। वे items.build और items.createपर पर कॉल किए जाते हैं। तो अगर आप items.build फोन और उसके बाद पैरेंट ऑब्जेक्ट (नेस्टेड विशेषताओं के साथ उदाहरण के लिए) को बचाने after_add कॉलबैक जुड़े वस्तु के निर्माण पर केवल एक बार बुलाया जाएगा। इसका मतलब है कि यदि माता-पिता के पास सत्यापन है तो items डेटाबेस में सहेजा नहीं जाएगा और आप after_add कॉलबैक पर भरोसा नहीं कर सकते हैं। दूसरे शब्दों में यह नहीं कहता कि जोड़ा गया एसोसिएशन का रिकॉर्ड डीबी में सहेजा गया था। इसलिए आपने गारंटी दी है कि आइटम जोड़ा गया है और केवल कॉल items.create पर सहेजा गया है। मुझे उम्मीद है कि आप इस स्पष्टीकरण को समझेंगे।

+0

मेरे लिए यह केवल काम करता है, यदि संबंधित ऑब्जेक्ट अपडेट किया गया है। यह मेरे लिए काम नहीं करता है, अगर संबंधित वस्तु को जोड़ा या हटा दिया गया है (तब से यह अब 'सेवाओं' एसोसिएशन में मौजूद नहीं है)। मैं क्या गलत कर रहा हूं? – morgler

संबंधित मुद्दे