2011-02-28 20 views
38

मेरे पास दो मॉडल हैं।
- Parenthas_manyChildren;
- Parentaccepts_nested_attributes_forChildren;नेस्टेड मॉडल और अभिभावक सत्यापन

class Parent < ActiveRecord::Base 
    has_many :children, :dependent => :destroy 
    accepts_nested_attributes_for :children, :allow_destroy => true 
    validates :children, :presence => true 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

मैं मान्यता का उपयोग हर माता पिता के लिए बच्चों की उपस्थिति की पुष्टि करने के, तो मैं बच्चों के बिना माता-पिता नहीं बचा सकता है।

parent = Parent.new :name => "Jose" 
parent.save 
#=> false 
parent.children_attributes = [{:name => "Pedro"}, {:name => "Emmy"}] 
parent.save 
#=> true 

सत्यापन कार्य। फिर हम _destroy विशेषता के माध्यम से बच्चों को नष्ट कर देगा:

parent.children_attributes = {"0" => {:id => 0, :_destroy => true}} 
parent.save 
#=> true !!! 
parent.reload.children 
#=> [] 

तो मैं नेस्ट रूपों और प्रमाणीकरण में सफल होगा के माध्यम से सभी बच्चों को नष्ट कर सकते हैं।

असल में ऐसा होता है क्योंकि के बाद मैं _delete के माध्यम से मेरे माता पिता से बच्चे को हटाने के लिए, बच्चों पद्धति अभी भी वस्तु को नष्ट कर दिया रिटर्न से पहले मैं इसे फिर से लोड है, तो सत्यापन पारित कर दिया:

parent.children_attributes = {"0" => {:id => 0, :_destroy => true}} 
parent.save 
#=> true !!! 
parent.children 
#=> #<Child id:1 ...> # It's actually deleted 
parent.reload.children 
#=> [] 

यह बग है?

प्रश्न क्या है। प्रश्न इसे सुधारने का सबसे अच्छा समाधान है। मेरा दृष्टिकोण 0_पर पहले_destroy फ़िल्टर को जोड़ने के लिए यह जांचने के लिए है कि यह आखिरी है या नहीं। लेकिन यह प्रणाली जटिल बनाता है।

उत्तर

57

यह शायद आपके लिए काम करेगा, लेकिन मुझे लगता है कि वहाँ एक बेहतर जवाब है। यह मेरे लिए एक बग की तरह लगता है।

class Parent 
    validate :must_have_children 

    def must_have_children 
    if children.empty? or children.all? {|child| child.marked_for_destruction? } 
     errors.add(:base, 'Must have at least one child') 
    end 
    end 
end 
+0

फिर भी यह बेहतर पर 'Child' पक्ष :) धन्यवाद – fl00r

+2

और' marked_for_destruction के लिए धन्यवाद मान्य तो है? ' – fl00r

+0

यह मान्यता पद्धति अभी भी रेल के रूप में 3.0.6 – astjohn

0

यह एक बग नहीं है। प्रलेखन

के अनुसार मान्य करता है कि निर्दिष्ट गुण खाली नहीं कर रहे हैं (वस्तु # खाली द्वारा परिभाषित के रूप में ?)

और validates :children, :presence => true सिर्फ एक ही है। प्रलेखन यह नहीं कहता कि क्या होता है यदि आप इसे किसी संगठन पर उपयोग करने का प्रयास करते हैं। आपको validate का उपयोग करके कस्टम सत्यापन का उपयोग करना चाहिए।

validates_presence_of संघ पर has_many का उपयोग blank? संघ children, जो वर्ग सरणी की एक वस्तु है पर कहता है। चूंकि blank? को Array के लिए परिभाषित नहीं किया गया है, इसलिए यह method_missing को रेल के अंदर पकड़ा जाता है। आम तौर पर यह वही करता है जो आप चाहते हैं लेकिन मुझे लगता है कि यह वास्तव में भयानक तरीके से रेल 3.1rc और रूबी 1.8.7 में विफल रहता है: यह चुपचाप संबंधित रिकॉर्ड के परिवर्तनों को उलट देता है। क्या हो रहा है यह जानने के लिए मुझे कुछ घंटे लग गए।

+2

दरअसल समस्या यह है कि बच्चों को हटाने से पहले बच्चों की मौजूदगी की पुष्टि होती है।तो हमें जांच करनी चाहिए कि क्या बच्चे 'mark_for_destruction? 'हैं – fl00r

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