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

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

您可以在:activated_atvalidation器上使用Proc 。

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

推荐阅读:


最后,您应该考虑重命名: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中删除。