活动记录验证 - 互斥属性

时间:2017-02-08 00:58:10

标签: ruby-on-rails activerecord

我想验证模型中的属性,以便如果存在其他属性则不应该。假设有2个属性 -

if a present:
  b should be NULL
  c should be NULL

如何使用验证来执行此操作?

:validates a, b => NULL, c => NULL

2 个答案:

答案 0 :(得分:2)

您可以使用自定义验证:

validate :check_presence

def check_presence
  if !self.a.blank?
    if !self.b.blank? or !self.c.blank?
      errors[:base] << " b and c should be null."
    end
  end
end

答案 1 :(得分:0)

我发现将:absenceif:一起使用非常容易阅读:

validates :b, :absence, if: :a
validates :c, :absence, if: :a

或者,如果您还想与abc完全互斥:

validates :a, :absence, if: ->(r) { r.b || r.c }
validates :b, :absence, if: ->(r) { r.a || r.c }
validates :c, :absence, if: ->(r) { r.a || r.b }

或使用一种方法:

validate :ensure_mutual_exclusion

def ensure_mutual_exclusion
  errors.add(:base, "...") if [a, b, c].count(&:present?) > 1
end