10

रेल 3 में, मुझे पता है कि मैं संबंधित_ओ पर निर्भर वस्तुओं को हटाने के लिए मजबूर कर सकता हूं और has_many संबंधों का उपयोग कर निर्भर करता हूं: निर्भर =>: विकल्प हटाएं। हालांकि मैं सोच रहा था,के लिए रेल 3 के लिए डिफ़ॉल्ट मान क्या हैं: has_many पर निर्भर है और संबंधित_to

डिफ़ॉल्ट व्यवहार अगर मैं निर्दिष्ट नहीं करते हैं क्या है: निर्भर => ...

चीयर्स, हाजो

+1

अगर आप इस निर्दिष्ट नहीं करते हैं, तो आप अपने माता-पिता के लिए रो रही परित्यक्त बच्चों के साथ खत्म हो जाएगा।यह एक बड़ा सौदा नहीं है लेकिन यह आपके डीबी (बेकार) डेटा से भरा रहता है – apneadiving

उत्तर

16

हालांकि यह documentation में लिखा हुआ नहीं है, डिफ़ॉल्ट व्यवहार संबंधित वस्तुओं के साथ कुछ भी नहीं करना है। यानी, किसी ऑब्जेक्ट को हटाने या नष्ट करने से ऑब्जेक्ट्स को हटा या नष्ट नहीं किया जाएगा, जिसमें से संबंधित है या इसमें से कई हैं।

+0

यह इंगित करने के लिए धन्यवाद :) मैं उम्मीद करता हूं कि रेल निर्भर वस्तुओं को लोड करने के लिए डीबी प्रश्नों का उपयोग करने का प्रयास करें, यदि उनके आईडी फ़ील्ड ठीक से नालीकृत नहीं हैं। इसका मतलब है, गैर-मौजूदा रिकॉर्ड खोजने के लिए सीपीयू और डीबी समय बर्बाद कर रहा है। तो मुझे आश्चर्य है कि क्यों रेल डिफ़ॉल्ट रूप से इसके बारे में कुछ नहीं कर रहे हैं ... – fxtentacle

6

has_many का उपयोग करता है: शून्य रणनीति, जो विदेशी को शून्य पर सेट करेगी। Has_many के लिए: इसके माध्यम से delete_all का उपयोग करेगा।

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

- ActiveRecord::Associations::ClassMethods

belongs_to वास्तव में क्या सुनिश्चित नहीं करता है, और डॉक्स में कुछ भी खोजने के लिए सक्षम नहीं था। मैं जल्द ही कुछ खुदाई करने की कोशिश करूंगा और जवाब अपडेट करूँगा।

+6

क्या आप वाकई यह मामला है? मैंने अभी अनुभव किया है कि डिफ़ॉल्ट व्यवहार विदेशी कुंजी को रद्द नहीं करना है। मुझे इसे 'निष्क्रिय': nullify' सेट करना था ताकि इसे स्पष्ट करने के लिए स्पष्ट रूप से प्राप्त किया जा सके। मैं रूबी 2.0.0 और रेल 4.0.0 का उपयोग कर रहा हूँ। – Magne

3

रेल 3 में, डिफ़ॉल्ट :dependent मान :nullify है जो शून्य के लिए विदेशी कुंजी सेट करता है।

डिफ़ॉल्ट के लिए डिफ़ॉल्ट रणनीति :nullify है। साथ ही, यह केवल तभी काम करता है जब स्रोत प्रतिबिंब belongs_to है।

स्रोत: http://guides.rubyonrails.org/3_1_release_notes.html#active-record

यह अभी भी रेल 4.

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

स्रोत: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy%3F

भी स्रोत कोड दस्तावेज़ देख सकेंगे: https://github.com/rails/rails/blob/b5a8fd7bb4a6fa4b67d4eabae4cea2cb1834d8d9/activerecord/lib/active_record/associations/collection_proxy.rb#L369

+0

दुर्भाग्य से यह सही नहीं है। उद्धृत दस्तावेज़ एक has_many एसोसिएशन (जैसे 'blog.posts.delete_all') पर कॉलिंग डिलीट/delete_all को संदर्भित करते हैं। एक मॉडल पर 'blog.destroy' को कॉल करना - संबंध में नहीं - संबंधित मॉडलों पर कुछ भी नहीं करेगा जब तक कि' has_many' संबंध 'निर्भर' व्यवहार निर्दिष्ट नहीं करता है। (डिफ़ॉल्ट खतरनाक संदर्भ छोड़ना है) – gmcnaughton