我有一个模型,其中有两个字段在技术上可以为null。字段名称为:is_activated
和:activated_at
。仅当:activated_at
设置为:is_activated
时才需要true
。如果:is_activated
为false
,则无需出现。 Rails将此验证直接设置为ActiveRecord的适当方式是什么?
答案 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?
将在false
和null
时返回true
。
答案 2 :(得分:1)
你可以这样做:
validates :activated_at, presence: true, if: :is_activated?
def is_activated?
self.is_activated
end
如果方法:activated_at
返回is_activated?
,则只会验证true
。