Rails:仅当另一个字段存在时才validation字段
我有一个模型,其中有两个字段在技术上可以为null。 字段名称为:is_activated
和:activated_at
。 :activated_at
仅当:is_activated
设置为true
时才需要:activated_at
。 如果:is_activated
为false
,则不需要存在。 Rails将此validation直接设置为ActiveRecord的适当方法是什么?
您可以在:activated_at
validation器上使用Proc 。
validates :activated_at, :presence, if: Proc.new { |a| a.is_activated? }
推荐阅读:
- http://guides.rubyonrails.org/active_record_validations.html#using-a-proc-with-if-and-unless
- http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
最后,您应该考虑重命名:is_activated
简单地:activated
。 这在Rails中被认为是更好的做法。 is_
前缀在其他语言中用于布尔属性,因为它们的方法名称不支持?
字符。 Ruby做了,Rails生成___?
布尔属性的方法。 因此,最好只调用属性:activated
并使用activated?
检查它activated?
。
非布尔属性。
如果您没有使用Boolean
属性(如is_activated
,并且希望确保在存在另一个非布尔属性时存在一个属性,则可以简化它:
validates :activated_at, presence: true, if: :activated_by?
activated_by?
将在null
时返回false
,否则返回true
。
你可以这样做:
validates :activated_at, presence: true, if: :is_activated? def is_activated? self.is_activated end
如果方法is_activated?
这只会validation:activated_at
is_activated?
返回true
。
您还可以使用带有Ruby代码的字符串,该代码将使用eval进行评估:
validates :activated_at, presence: true, if: 'is_activated'
我认为这是一个优雅的解决方案,当有这么短的条件,虽然这个选项已在Rails 5.2中删除。