मैं एक क्षेत्र या किसी अन्य की उपस्थिति को कैसे मान्य करूं लेकिन दोनों को और कम से कम एक को नहीं?
मैं एक क्षेत्र या किसी अन्य की उपस्थिति को कैसे मान्य करूं लेकिन दोनों को और कम से कम एक को नहीं?
जवाबों:
यदि आप संख्यात्मकता मान्यताओं जैसे सशर्त को जोड़ते हैं तो आपका कोड काम करेगा:
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, allow_nil: true
validates_numericality_of :payment, allow_nil: true
validate :charge_xor_payment
private
def charge_xor_payment
unless charge.blank? ^ payment.blank?
errors.add(:base, "Specify a charge or a payment, not both")
end
end
end
मुझे लगता है कि यह रेल 3+ में अधिक मुहावरेदार है:
उदाहरण के लिए: मान्य है कि में से एक के लिए user_nameया emailमौजूद है:
validates :user_name, presence: true, unless: ->(user){user.email.present?}
validates :email, presence: true, unless: ->(user){user.user_name.present?}
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, allow_nil: true
validates_numericality_of :payment, allow_nil: true
validate :charge_xor_payment
private
def charge_xor_payment
if [charge, payment].compact.count != 1
errors.add(:base, "Specify a charge or a payment, not both")
end
end
end
आप इसे 3 या अधिक मानों के साथ भी कर सकते हैं:
if [month_day, week_day, hour].compact.count != 1
रेल 3 के लिए उदाहरण।
class Transaction < ActiveRecord::Base
validates_presence_of :date
validates_presence_of :name
validates_numericality_of :charge, :unless => proc{|obj| obj.charge.blank?}
validates_numericality_of :payment, :unless => proc{|obj| obj.payment.blank?}
validate :charge_xor_payment
private
def charge_xor_payment
if !(charge.blank? ^ payment.blank?)
errors[:base] << "Specify a charge or a payment, not both"
end
end
end
मैंने इस सवाल का जवाब नीचे दिया। इस उदाहरण में :descriptionऔर :keywordsऐसे क्षेत्र हैं जिनमें से एक रिक्त नहीं है:
validate :some_was_present
belongs_to :seo_customable, polymorphic: true
def some_was_present
desc = description.blank?
errors.add(desc ? :description : :keywords, t('errors.messages.blank')) if desc && keywords.blank?
end
प्रोक या सिंबल का उपयोग करके सत्यापन : यदि और: जब तक सत्यापन होने से पहले सही नहीं कहा जाएगा।
तो दोनों क्षेत्रों में से एक की उपस्थिति इस तरह हो सकती है:
validates :charge,
presence: true,
if: ->(user){user.charge.present? || user.payment.present?}
validates :payment,
presence: true,
if: ->(user){user.payment.present? || user.charge.present?}
(उदाहरण स्निपेट) कोड में :ifया :unlessनवीनतम आइटम के रूप में है, हालांकि जैसा कि डॉक्टर में घोषित किया गया है, सत्यापन होने से पहले इसे सही कहा जाएगा - इसलिए स्थिति मिलान के बाद एक और जाँच काम करेगी।