2010-11-30 17 views
10

मैं इसे कैसे बना सकता हूं ताकि उत्पाद सबमिट करने के लिए कम से कम दो विकल्प रिकॉर्ड आवश्यक हों?रेल नेस्टेड गुणों को कम किया गया है: कम से कम दो रिकॉर्ड की आवश्यकता है

class Product < ActiveRecord::Base 
    belongs_to :user 
    has_many :options, :dependent => :destroy 
    accepts_nested_attributes_for :options, :allow_destroy => :true, :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } } 
    validates_presence_of :user_id, :created_at 
    validates :description, :presence => true, :length => {:minimum => 0, :maximum => 500} 
end 

class Option < ActiveRecord::Base 
    belongs_to :product 
    validates :name, :length => {:minimum => 0, :maximum => 60}     
end 
+0

यह बहुत एक कस्टम मान्यता के साथ क्या करना सरल होना चाहिए। कुछ self.errors.add_to_base ("दो विकल्प आवश्यक हैं") जब तक self.options.length> = 2' – Todd

+0

धन्यवाद जो काम करता है! – morcutt

+0

यदि आप 'accepts_nested_attributes_for' का उपयोग' allow_destroy: true' के साथ कर रहे हैं तो आपको बच्चों की सटीक लंबाई खोजने के लिए बच्चों के संगठन के साथ 'mark_for_destruction? 'का उपयोग करना चाहिए, क्योंकि कुछ ऑब्जेक्ट्स को फ़ॉर्म से सबमिट करते समय यह संभव हो सकता है' _destroy: वस्तु बचाने के बाद विनाश के लिए सच '। लंबाई, आकार और गिनती उस मामले के लिए सही काम नहीं करेगी। इस लिंक का सही जवाब है। [लिंक] (http://stackoverflow.com/a/28476834/4377172) –

उत्तर

15
class Product < ActiveRecord::Base 
    #... all your other stuff 
    validate :require_two_options 

    private 
    def require_two_options 
     errors.add(:base, "You must provide at least two options") if options.size < 2 
    end 
end 
+1

add_to_base (msg) को बहिष्कृत कर दिया गया है, त्रुटियों # जोड़ें (: आधार, msg) के बजाय – AnApprentice

+0

संपादित करें, टिप – karmajunkie

+4

विकल्प.count के लिए धन्यवाद आपके पास विकल्पों की संख्या खोजने के लिए एक SQL COUNT क्वेरी उत्पन्न होगी। यदि आपके विकल्प स्मृति में हैं, और डेटाबेस में सहेजे नहीं गए हैं, तो यह एक अप्रत्याशित उत्तर देगा क्योंकि उन्हें गिनती में शामिल नहीं किया जाएगा। [इस तरह के मामलों में आकार का उपयोग करने पर विचार करें।] (Http://stackoverflow.com/questions/6083219/activerecord-size-vs-count) –

12

बस karmajunkie जवाब के बारे में विचार: मैं (अभी तक अपने डेटाबेस पर नहीं) size बजाय count का प्रयोग करेंगे क्योंकि अगर कुछ बनाया (और नहीं बचाया) नेस्ट वस्तु में त्रुटियाँ हैं, यह विचार नहीं किया जाएगा ।

class Product < ActiveRecord::Base 
    #... all your other stuff 
    validate :require_two_options 

    private 
    def require_two_options 
     errors.add(:base, "You must provide at least two options") if options.size < 2 
    end 
end 
+0

.size जाने का तरीका है जैसा कि आपने कहा है कि यह मानता है कि यह डेटाबेस में नहीं है। – wallerjake

+0

'.count' मेरे लिए भी काम नहीं करता था। 'आकार 'निश्चित रूप से जाने का रास्ता है। – Tintin81

1

अपने प्रपत्र की अनुमति देता है रिकॉर्ड हटाए जाने के लिए तो .size के रूप में यह रिकॉर्ड विनाश के लिए चिह्नित शामिल काम नहीं करेंगे।

मेरे समाधान किया गया था:

validate :require_two_options 

private 
def require_two_options 
    i = 0 
    product_options.each do |option| 
     i += 1 unless option.marked_for_destruction? 
    end 
    errors.add(:base, "You must provide at least two option") if i < 2 
end 
+0

+1 विनाश के लिए चिह्नित रिकॉर्ड दिमागी रिकॉर्ड के बारे में अच्छा बिंदु। हालांकि, 'i' प्राप्त करने के लिए कुछ हद तक क्लीनर तरीका' i = product_options.reject {| विकल्प | हो सकता है option.marked_for_destruction? } .size'। – februaryInk

0

tidier कोड, रेल 5 के साथ परीक्षण किया:

class Product < ActiveRecord::Base 
    OPTIONS_SIZE_MIN = 2 
    validate :require_two_options 

    private 

    def options_count_valid? 
    options.reject(&:marked_for_destruction?).size >= OPTIONS_SIZE_MIN 
    end 

    def require_two_options 
    errors.add(:base, 'You must provide at least two options') unless options_count_valid? 
    end 
end 
संबंधित मुद्दे