Rails:仅当另一个字段存在时才验证字段

时间:2012-12-06 18:49:05

标签: ruby-on-rails ruby validation activerecord

我有一个模型,其中有两个字段在技术上可以为null。字段名称为:is_activated:activated_at。仅当:activated_at设置为:is_activated时才需要true。如果:is_activatedfalse,则无需出现。 Rails将此验证直接设置为ActiveRecord的适当方式是什么?

3 个答案:

答案 0 :(得分:34)

您可以在:activated_at验证码上使用Proc

validates :activated_at, :presence, if: Proc.new { |a| a.is_activated? }

推荐阅读:


最后,您应该考虑将:is_activated重命名为:activated。这在Rails中被认为是更好的做法。 is_前缀在其他语言中用于布尔属性,因为它们的方法名称不支持?字符。 Ruby做了,Rails在布尔属性上生成___?方法。因此,最好只需调用属性:activated并使用activated?进行检查。

答案 1 :(得分:2)

非布尔属性。

如果您没有使用Boolean属性,例如is_activated,并且想要确保在存在另一个非布尔属性时存在一个属性,则可以简化它:

validates :activated_at, presence: true, if: :activated_by?

activated_by?将在falsenull时返回true

答案 2 :(得分:1)

你可以这样做:

validates :activated_at, presence: true, if: :is_activated?

def is_activated?
  self.is_activated
end

如果方法:activated_at返回is_activated?,则只会验证true