আমি কীভাবে একটি ক্ষেত্র বা অন্য ক্ষেত্রের উপস্থিতি যাচাই করব তবে উভয় এবং কমপক্ষে একটি নয়?
আমি কীভাবে একটি ক্ষেত্র বা অন্য ক্ষেত্রের উপস্থিতি যাচাই করব তবে উভয় এবং কমপক্ষে একটি নয়?
উত্তর:
আপনি যদি এই জাতীয় সংখ্যার বৈধতাগুলিতে শর্ত যুক্ত করেন তবে আপনার কোড কাজ করবে:
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
এটি সর্বশেষ আইটেম হিসাবে রয়েছে , তবে ডকমে ঘোষিত হিসাবে এটি বৈধতা হওয়ার আগে ডাকা হবে - সুতরাং শর্তটি মিলে গেলে অন্য চেকিংয়ের পরে কাজ হবে।