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?"
除了看起来很难看之外,当我需要添加更多选项时,此代码将无法扩展。有没有办法使用"或"运算符并提供条件的散列,或者无论如何使它看起来更好。
答案 0 :(得分:1)
如果您在该指南中向上滚动大约半页,您会看到两种可能的解决方案:Using a string或using 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