17

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

4

3 回答 3

40

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

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

推荐阅读:


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

于 2012-12-06T18:52:41.260 回答
5

非布尔属性。

如果您不使用Boolean属性,例如is_activated,并希望确保一个属性在另一个非布尔属性存在时存在,您可以简化它:

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

activated_by?false何时返回nulltrue否则返回。

于 2015-05-28T15:37:15.317 回答
1

你可以这样做:

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

def is_activated?
  self.is_activated
end

这只会验证:activated_at方法是否is_activated?返回true

于 2012-12-06T18:53:02.677 回答