ruby on rails - नेस्टेड विशेषताओं को रेखांकित करता है: कम से कम दो रिकॉर्ड की आवश्यकता होती है




ruby-on-rails validation (3)

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

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

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

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

यदि आपका फ़ॉर्म रिकॉर्ड्स को हटाए जाने की अनुमति देता है तो .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

टेडीर कोड, रेल 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