尝试:
class WithdrawalAccount < ActiveRecord::Base
has_one :sepa_account
has_one :international_account
validates :sepa_account, presence: true, if: ->(instance) { instance.international_account.blank? }
validates :international_account, presence: true, if: ->(instance) { instance.sepa_account.blank? }
end
要验证任何一个,你应该更喜欢下面的方法:
class WithdrawalAccount < ActiveRecord::Base
validate :accounts_consistency
private
def accounts_consistency
# XOR operator more information here http://en.wikipedia.org/wiki/Xor
unless sepa_account.blank?^international_account.blank?
errors.add(:base, "options consistency error")
end
end
end
拥有超过2个属性来验证:
由于XOR将不工作与超过2个属性(a^b^c
)我们可以ch埃克使用循环属性:
def accounts_consistency
attributes = [sepa_account, international_account, third_account, fourth_account]
result = attributes.select do |attr|
!attr.nil?
end
unless result.count == 1
errors.add(:base, "options consistency error")
end
end
感谢。你将如何验证只有一个可以存在? 'sepa_account'或'international_account',但只有一个? – Martin
当有4个属性来执行XOR时,这似乎有缺陷。例如:'nil^true^true^true'返回'true'。如果有人同时推送3种类型的帐户,看起来像这种XOR条件将会使他们一切顺利。 – Martin
这是一个很好的问题。我会仔细研究它,看看我能想出什么 –