在activerecord验证中使用“或”运算符

时间:2014-09-24 20:34:13

标签: ruby-on-rails validation activerecord ruby-on-rails-4

Activerecod validations guide,说我可以结合条件,如果我的所有条件都匹配,验证就会发生。

validates :foo, presence: true, if: "bar.present?", if: "baz.present?"

我有一个场景需要验证" foo"什么时候" bar"或" baz"在场。

我已经解决了这个问题,并进行了两次验证:

validates :foo, presence: true, if: "bar.present?"
validates :foo, presence: true, if: "baz.present?"

除了看起来很难看之外,当我需要添加更多选项时,此代码将无法扩展。有没有办法使用"或"运算符并提供条件的散列,或者无论如何使它看起来更好。

2 个答案:

答案 0 :(得分:1)

如果您在该指南中向上滚动大约半页,您会看到两种可能的解决方案:Using a stringusing a Proc

字符串:

validates :foo, presence: true, if: "bar.present? || baz.present?"

Proc(指南使用Proc.new但在Ruby 1.9.3+中我们有方便的proc方法):

validates :foo, presence: true,
  if: proc {|record| record.bar.present? || record.baz.present? }

或者,如果您使用的是Ruby 2.0+,并且像我一样,更喜欢“stabby lambda”语法:

validates :foo, presence: true,
  if: ->(record) { record.bar.present? || record.baz.present? }

答案 1 :(得分:0)

最佳做法是定义响应两个属性的方法

validates :foo, presence: true, if: :has_baz_and_bar?

def has_baz_and_bar?
  [bar, baz].all?(&:present?)
end