2013-06-05 4 views
12
class Post < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :tags, through: :posts_tags 
end 

class PostsTag < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :posts, through: :posts_tags 
end 

जब पोस्ट नष्ट हो जाता है, तो मैं अपने सभी संगठनों को टैग को भी हटा देना चाहता हूं। मैं पोस्टटाग मॉडल पर चलाने के लिए सत्यापन नहीं चाहता हूं। मैं बस हटाना चाहता हूँ।has_many को हटाने का सही तरीका: रिकॉर्ड में शामिल होने के माध्यम से?

मुझे पता चला है कि पोस्ट मॉडल कार्यों के पोस्ट टैग के संबंध में रिश्ते पर एक निर्भरता जोड़ना चाहता है जैसा कि मैं चाहता हूं: has_many :posts_tags, dependent: :delete_all

हालांकि, इस विषय पर प्रलेखन सुझाव देता है कि मुझे इसके बजाय ऐसा करना चाहिए: has_many :tags, through: :posts_tags, dependent: :delete_all। जब मैं ऐसा करता हूं, टैग ऑब्जेक्ट नष्ट हो जाता है और जॉइन ऑब्जेक्ट बनी हुई है।

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

has_many के लिए, को नष्ट हमेशा रिकॉर्ड (रों) इतना है कि कॉलबैक चलाए जा रहे हैं हटाए जाने की विधि को नष्ट कॉल करेंगे। हालांकि हटाएं या तो निर्भर विकल्प द्वारा निर्दिष्ट रणनीति के अनुसार हटाना होगा: या यदि नहीं: आश्रित विकल्प दिया गया है, तो यह डिफ़ॉल्ट रणनीति का पालन करेगा। डिफ़ॉल्ट रणनीति है: nullify (nil को विदेशी कुंजी सेट करें), has_many को छोड़कर: जहां डिफ़ॉल्ट रणनीति delete_all है (शामिल कॉल रिकॉर्ड हटाएं, उनके कॉलबैक चलाने के बिना)।

  1. मैं डिफ़ॉल्ट रणनीति वास्तव में इस्तेमाल किया कैसे हो सकती है? अगर मैं छोड़ देता हूं: पूरी तरह से निर्भर, किसी भी रिकॉर्ड को हटाया नहीं जाता है। और मैं सिर्फ संकेत नहीं दे सकता: एक has_many रिश्ते पर निर्भर है। रेल वापस आते हैं और कहते हैं, ": आश्रित विकल्प या तो उम्मीद करता है: नष्ट करें, हटाएं_all,: nullify या: प्रतिबंधित ({})"।
  2. अगर मैं निर्दिष्ट नहीं करते हैं: रिश्तों में से किसी पर निर्भर है, यह PostsTag वस्तु पर post_id को रद्द नहीं करता है के रूप में यह

शायद मैं यह गलत और दृष्टिकोण है कि मैंने पाया पढ़ रहा हूँ सुझाव है कि लगता है काम सही तरीका है?

+1

यदि एकाधिक पोस्ट द्वारा टैग का उपयोग किया जाता है तो क्या होता है? यदि एक पोस्ट हटा दी जाती है, तो अन्य पोस्ट प्रभावित होंगे। –

+0

सत्य, और टैग में 'has_many होना चाहिए: पदों के माध्यम से:: posts_tags' पोस्ट नहीं, मैं post_tany को हटाने के लिए' has_many: posts_tags, निर्भर:: नष्ट 'का उपयोग करता हूं और टैग को अकेले छोड़ देता हूं। आप एक रेक कार्य या कंसोल के साथ अनाथ टैग हटा सकते हैं। – rmagnum2002

+0

एसोसिएशन फिक्स्ड, धन्यवाद। मैं सिर्फ दस्तावेज़ीकरण को समझने की कोशिश कर रहा हूं।शब्द उलझन में है – Brian

उत्तर

17

आपका के मूल विचार:

has_many :posts_tags, dependent: :delete_all 

वास्तव में आप क्या चाहते है। आप नहीं इस पर कई घोषणाओं को घोषित करना चाहते हैं-हालांकि संघ :tags, क्योंकि यह सभी संबंधित टैग को नष्ट कर देगा। जो आप हटाना चाहते हैं वह स्वयं ही एसोसिएशन है - जो कि पोस्टटाग मॉडल में शामिल होता है।

तो दस्तावेज़ कहें कि वे क्या करते हैं?

Post.find(1).destroy 
Post.find(1).tags.delete 

पहली कॉल (अपने परिदृश्य) बस पोस्ट को नष्ट कर देगा: आप परिदृश्य कि प्रलेखन वर्णन है गलत समझ रहे हैं। यही है, जब तक कि आप :dependent रणनीति निर्दिष्ट नहीं करते हैं, जैसा कि मैंने सुझाव दिया है कि आप करते हैं। दूसरा कॉल दस्तावेज वर्णन कर रहा है। कॉलिंग .tags.delete (डिफ़ॉल्ट रूप से) वास्तव में टैग को नष्ट नहीं करेगा (क्योंकि वे कई-से-गुजर चुके हैं), लेकिन संबंधित टैग शामिल हैं जो इन टैग में शामिल हो जाते हैं।

+0

आह धन्यवाद जो अधिक समझ में आता है – Brian

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