स्वीकृत उत्तर मूल समस्या को हल नहीं करता है।जोस 2 बातें करना चाहता था:
1) यह सुनिश्चित करने के जनक हमेशा की तरह ही कम से कम एक बच्चे
और
2) जब जनक
आप हटा दी जाती है सभी बच्चों को हटाने के लिए सक्षम होने के लिए किसी बच्चे को हटाने से रोकने के लिए before_destroy
कॉलबैक की आवश्यकता नहीं है।
मैंने detailed blog post describing the solution लिखा, लेकिन मैं यहां मूल बातें भी शामिल करूंगा।
समाधान में विभिन्न तत्व शामिल हैं: अभिभावक मॉडल में उपस्थिति सत्यापन और नेस्टेड विशेषताओं का उपयोग, और यह सुनिश्चित करना कि बच्चे को हटाए जाने वाली विधि बच्चे पर .destroy
पर कॉल नहीं करती है, लेकिन बच्चे को हटा दिया जाता है नेस्टेड विशेषताओं के माध्यम से अभिभावक मॉडल।
जनक मॉडल में:
attr_accessible :children_attributes
has_many :children, dependent: :destroy
accepts_nested_attributes_for :children, allow_destroy: true
validates :children, presence: true
बच्चे मॉडल में:
belongs_to :parent
इसके बाद, बच्चों, हटाए जाने के लिए पिछले एक को छोड़कर अनुमति देने के लिए सबसे आसान तरीका है, है नेस्ट का उपयोग करने के लिए फॉर्म, जैसा कि Railscasts #196 में शामिल है। असल में, आपके पास माता-पिता और बच्चों दोनों के लिए फ़ील्ड के साथ एक फॉर्म होगा। स्थान के साथ-साथ बच्चों के विलोपन सहित बच्चों के लिए कोई भी अपडेट, माता-पिता नियंत्रक में update
कार्रवाई द्वारा संसाधित किया जाएगा।
जिस तरह से आप नेस्टेड रूपों के माध्यम से बच्चे को हटाते हैं, वह _destroy
नामक कुंजी में गुजरकर एक वास्तविक मूल्य का मूल्यांकन करता है। allow_destroy: true
विकल्प जिसे हम अभिभावक मॉडल में सेट करते हैं वह यह है कि यह क्या अनुमति देता है। Active Record Nested Attributes के लिए दस्तावेज़ इस को शामिल किया गया है, लेकिन यहाँ एक त्वरित उदाहरण से पता चलता है कि कैसे आप एक बच्चे जिसका id
के बराबर होती है 2
इसके जनक से हटाना होगा है:
parent.children_attributes = { id: '2', _destroy: '1' }
parent.save
ध्यान दें कि आप जनक नियंत्रक में इस खुद कर की जरूरत नहीं है यदि आप रेलस्टास्ट # 1 9 6 में नेस्टेड रूपों का उपयोग कर रहे हैं। रेल आपके लिए इसका ख्याल रखती है।
अभिभावक मॉडल में उपस्थिति सत्यापन के साथ, रेल स्वचालित रूप से अंतिम बच्चे को हटाए जाने से रोक देगा।
मुझे लगता है कि उस समय जोस ने अपना प्रश्न पोस्ट किया था, उपस्थिति सत्यापन उस तरीके से काम नहीं कर रहा था जिस तरह से यह माना जाता था। यह जुलाई 2012 तक इस pull request के साथ तय नहीं किया गया था, लेकिन यह लगभग 2 साल पहले था। 12 दिन पहले अपने पुराने समाधान को डीबॉर्टज़ को देखते हुए मुझे एहसास हुआ कि इस मुद्दे के बारे में अभी भी भ्रम है, इसलिए मैं सही समाधान पोस्ट करना सुनिश्चित करना चाहता था।
एक वैकल्पिक समाधान है कि नेस्टेड रूपों का उपयोग नहीं करता है, अपने ब्लॉग पोस्ट को देखने के लिए: जब सीधे पर destroy
बुला
class Parent < AR::Base
has_many :children, dependent: :destroy
end
class Child < AR::Base
belongs_to :parent
before_destroy :check_destroy_allowed, unless: :destroyed_by_association
private
def check_destroy_allowed
# some condition that returns true or falls
end
end
इस तरह,: http://www.moncefbelyamani.com/rails-prevent-the-destruction-of-child-object-when-parent-requires-its-presence/
क्या 'माता-पिता -> बाल' संबंध का नाम 'बच्चों 'नहीं होना चाहिए? मुझे पूरा यकीन है कि रेल समझ जाएंगे कि आप वैसे भी 'चाइल्ड' मॉडल को इंगित कर रहे हैं। – Frost
हाहा हाँ ... ठीक है, वे वास्तविक नाम नहीं हैं, इसलिए इससे कोई फर्क नहीं पड़ता :) मेरी मुट्ठी भाषा अंग्रेजी नहीं है, और मैं बच्चे के बहुवचन को भूल गया है –