2012-03-31 6 views

उत्तर

23

Mongoid (और भी ActiveRecord मेरा मानना ​​है कि), delete बस डेटाबेस से वस्तु को हटा देता है। destroy ऑब्जेक्ट को हटा देगा और मॉडल द्वारा परिभाषित सभी उचित कॉलबैक चलाएगा। इसलिए यदि आपके पास मॉडल पर before_destroy कॉलबैक है और आप delete उस मॉडल का एक उदाहरण है, तो before_destroy कॉलबैक नहीं कहा जाएगा।

तो dependent: :destroy हटाते समय मॉडल के कॉलबैक चलाता है और dependent: :delete नहीं करता है।

+0

इसलिए यदि मेरे पास कोई कॉलबैक नहीं है तो वे वही बात हैं? –

+2

हाँ, मैं शायद 'नष्ट' का उपयोग करने पर विचार करता हूं। यदि आप कभी भी कॉलबैक जोड़ते हैं, तो आपको इसे 'हटाएं' से 'नष्ट' करने के लिए याद रखना होगा जबतक कि आप वास्तव में कॉलबैक को चलाने के लिए नहीं चाहते हैं। –

+3

नहीं, यदि आपके पास कॉलबैक नहीं है तो भी वे वही नहीं हैं। चूंकि 'नष्ट' कॉलबैक पर निर्भर है, इसलिए कॉलबैक निष्पादित करने के लिए इसे संबंधित दस्तावेज़ लोड करना होगा, और DELETE क्वेरी करें। 'हटाएं' सिर्फ एक DELETE क्वेरी बनाता है। फिर, नष्ट "सुरक्षित" है, लेकिन हटाएं "तेज़" है – tothemario

2
  • destroy मॉडल कॉलबैक चलाता है और फिर डीबी को एक रिमूव क्वेरी बनाता है।
  • delete बस डीबी को एक रिमूव क्वेरी बनाता है।

नाम ActiveRecord से लिया गया है, यही कारण है कि वे मोंगो से बहुत अच्छी तरह मेल नहीं खाते हैं।

destroy पर ऑप्टिमाइज़ेशन के रूप में आप delete देख सकते थे। जब आप destroy का उपयोग करते हैं, तो आप सुनिश्चित करते हैं कि before_destroy कॉलबैक निष्पादित किए गए हैं, इसलिए उचित सफाई की जाती है। दूसरी तरफ, यदि आप Model.destroy_all जैसे कुछ करते हैं, तो उसे सभी तत्वों को लोड करना होगा, और फिर उनमें से प्रत्येक के लिए एक रिमूव क्वेरी बनाना होगा, चाहे Model.delete_all केवल एक क्वेरी बनाता है।

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