2015-02-18 11 views
9

मैं आश्रित का उपयोग करने की कोशिश कर रहा हूं:: सफलता के बिना नष्ट करें।आश्रित काम नहीं कर रहा

चलिए एक साधारण उदाहरण देते हैं। मैं निम्नलिखित के साथ एक सरल आवेदन बनाएँ:

rails g model parent 
rails g model child parent:references 

जोड़ें निम्नलिखित लाइनों parent.rb को

has_many :children, dependent: :destroy 

मैं क्या रेल कंसोल में निम्नलिखित परीक्षण (रेल ग)

p = Parent.create! 
c = Child.create! 
c.parent = p 
c.save 
#check association 
Child.first == Child.first.parent.children.first 
p.delete 
#This should return 0 
Child.count == 0 

और Child.count रिटर्न 1.

मुझे क्या याद आ रही है?

धन्यवाद

+4

आपको 'p.destroy' करने की आवश्यकता है .. –

+1

ऑब्जेक्ट के पहले_destroy और after_destroy कॉलबैक या किसी भी: आश्रित सहयोग विकल्प को लागू करने के लिए, #destroy का उपयोग करें: http://api.rubyonrails.org/classes/ActiveRecord/Persistence। एचटीएमएल # विधि-ए-हटाना – siekfried

उत्तर

16

4.2.2.4 :dependent

आप के लिए :dependent विकल्प सेट करते हैं:

  • :destroy, जब वस्तु नष्ट हो जाता है, #destroy उसके संबंधित वस्तुओं पर बुलाया जाएगा।
  • :delete, जब वस्तु नष्ट हो जाता है, अपने सभी संबद्ध वस्तुओं उनके #destroy विधि बुला के बिना डेटाबेस से सीधे हटा दिया जाएगा।

आपकी सेटिंग्स के अनुसार, आपको p.destroy करना है।

The :dependent विकल्प में अलग-अलग मान हो सकते हैं जो निर्दिष्ट करते हैं कि विलोपन कैसे किया जाता है। अधिक जानकारी के लिए, विभिन्न विशिष्ट एसोसिएशन प्रकारों पर इस विकल्प के लिए प्रलेखन देखें। जब कोई विकल्प दिया गया है, तो व्यवहार रिकॉर्ड को नष्ट करते समय संबंधित रिकॉर्ड के साथ कुछ भी नहीं करना है।

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

5

एक ActiveRecord ली गई वस्तु पर delete विधि एक सीधा DELETE बयान जारी करेगा कॉलिंग इस तरह के रूप में किसी भी dependent: destroy ActiveRecord कॉलबैक और विन्यास लंघन डेटाबेस करते हैं।

मुझे विश्वास है कि आप destroy विधि चाहते हैं।

आप डेटाबेस में एक विदेशी कुंजी भी स्थापित कर सकते हैं और इसे हटाने पर कैस्केड करने के लिए सेट कर सकते हैं, यह आपकी आवश्यकताओं के आधार पर समझ में आ सकता है।

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