我有一个模型,其中有两个字段在技术上可以为空。字段名称是:is_activated
和:activated_at
。仅当设置:activated_at
为 时才需要。如果is 则不需要存在。在 Rails 中将此验证直接设置到 ActiveRecord 中的适当方法是什么?:is_activated
true
:is_activated
false
问问题
14767 次
3 回答
40
您可以在验证器上使用Proc 。:activated_at
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
为 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
何时返回null
,true
否则返回。
于 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 回答