रेलें: आश्रित =>: वीएस को नष्ट करें: आश्रित =>: delete_all


192

रेल गाइड में यह इस तरह वर्णित है:

यदि वे साथ जुड़े हुए हैं :dependent => :destroyऔर नष्ट कर दिए गए हैं, तो ऑब्जेक्ट्स नष्ट हो जाएंगे:dependent => :delete_all

सही है, अच्छा है। लेकिन नष्ट होने और नष्ट होने के बीच अंतर क्या है? मैंने दोनों की कोशिश की और ऐसा ही लगता है।

जवाबों:


200

अंतर कॉलबैक के साथ है।

:delete_allसीधे अपने आवेदन में किए गए और SQL से हटा देता है:

DELETE * FROM users where compagny_id = XXXX

के साथ :destroy, आपके सभी बच्चों का एक पल है। इसलिए, यदि आप इसे नष्ट नहीं कर सकते हैं या यदि प्रत्येक का अपना है :dependent, तो इसके कॉलबैक कहे जा सकते हैं।


83
प्रत्येक बच्चे वस्तुओं पर तात्कालिकता और विनाश की कॉलिंग धीमी हो जाएगी यदि आपके पास बहुत सारे बच्चे हैं (और n ^ 2 यदि आपके पास पोते हैं, और इसी तरह)। delete_all "ऑर्बिट से एनक्यूटी" समाधान का एक प्रकार है, जहां आप मॉडल पर कॉलबैक को नष्ट करने से पहले / उसके बारे में कोई परवाह नहीं करते / करते हैं।
रयान बिग

131

रेल के मॉडल एसोसिएशन पर आप :dependentविकल्प को निर्दिष्ट कर सकते हैं , जो निम्नलिखित तीन रूपों में से एक ले सकता है:

  • :destroy/:destroy_allइस ऑब्जेक्ट के साथ संबंधित ऑब्जेक्ट्स को उनके destroyतरीके से कॉल करके नष्ट कर दिया जाता है
  • :delete/:delete_allसभी संबंधित वस्तुओं को उनकी :destroyविधि को कॉल किए बिना तुरंत नष्ट कर दिया जाता है
  • :nullifyसभी संबंधित ऑब्जेक्ट्स की विदेशी कुंजियाँ NULLउनके saveकॉलबैक को कॉल किए बिना सेट की जाती हैं

2
आधिकारिक rdocs के लिए api.rubyonrails.org/classes/ActiveRecord/Associations/… ("nullify" के लिए खोज) देखें।
mrm

21
रेल 3.0 के बाद से यह निर्दिष्ट करना भी संभव है :restrictयदि इसके लिए सेट किया गया है: इस ऑब्जेक्ट को प्रतिबंधित किया जा सकता है यदि इसके पास कोई संबद्ध ऑब्जेक्ट नहीं है।
राकेट

17
वहाँ कोई है :deleteया :destroy_allइसके बारे में दिखता द्वारा विकल्प? : आश्रित विकल्प या तो उम्मीद करता है: नष्ट,: delete_all,: nullify या: प्रतिबंधित (: हटाएं)
माइक कैम्पबेल

2
@ माइककैम्पबेल :deleteऔर :destroy_allविकल्प मौजूद नहीं हैं। हालांकि, मॉडल पर वर्ग विधियां हैं जिन्हें कहा जाता है deleteऔर destroy_allइसलिए यह भ्रम का कारण हो सकता है।
बेरेज़ोव्स्की

@ माइककैंपबेल आपको कुछ और विकल्प याद आ रहे हैं, देखें: आश्रित विकल्प में से एक होना चाहिए: [नष्ट करें, नष्ट करें: हटाएं, हटाएं: nullify,: limited_with_error,: प्रतिबंधित_with_exception]
प्रवीण मिश्रा

30

देखें हटाए नष्ट उसके संबंधित तत्वों जहां delete_all स्वयं मेज से एक से अधिक डेटा को नष्ट कर सकते के रूप मेंDELETE * FROM table where field = 'xyz'

: आश्रित संभावित विकल्प:

नियंत्रित करता है कि संबंधित वस्तुओं का क्या होता है जब उनका मालिक नष्ट हो जाता है। ध्यान दें कि ये कॉलबैक के रूप में कार्यान्वित किए गए हैं, और क्रम में कॉलबैक निष्पादित करता है। इसलिए, अन्य समान कॉलबैक प्रभावित कर सकते हैं: निर्भर व्यवहार, और :dependentव्यवहार अन्य कॉलबैक को प्रभावित कर सकता है।

:destroy सभी संबद्ध वस्तुओं को भी नष्ट कर दिया जाता है।

:delete_all डेटाबेस से सभी संबंधित ऑब्जेक्ट को सीधे हटा दिया जाता है (इसलिए कॉलबैक निष्पादित नहीं किया जाएगा)।

:nullifyविदेशी कुंजियों को NULL पर सेट करने का कारण बनता है। कॉलबैक निष्पादित नहीं किए जाते हैं।

:restrict_with_exception यदि कोई संबद्ध रिकॉर्ड हैं तो एक अपवाद को उठाया जा सकता है।

:restrict_with_error यदि कोई संबद्ध ऑब्जेक्ट हैं तो स्वामी को जोड़ने के लिए एक त्रुटि का कारण बनता है।

यदि :throughविकल्प के साथ प्रयोग किया जाता है, तो जुड़ने वाले मॉडल पर संघ का एक___ होना चाहिए, और जो रिकॉर्ड हटा दिए जाते हैं, वे संबद्ध रिकॉर्ड के बजाय शामिल रिकॉर्ड होते हैं।


3

वास्तव में मुख्य अंतर यह है कि किसी भी कॉलबैक :delete_allका उपयोग किए जाने पर आह्वान नहीं किया जाएगा । लेकिन जब :destroyकॉलबैक स्टैक का उपयोग किया जाता है ( :after_destroy, :after_commit...) निकाल दिया जाएगा।

नतीजतन, यदि आपके पास touch:हटाए जा रहे मॉडलों में घोषणाएं हैं तो बेहतर है dependent: :delete_allकि आप 'निर्भर:: नष्ट' का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.