2012-12-18 31 views
1

我已经定义了一个Mongoid模型与整型字段,我验证numericality这样Mongoid:加载ActiveModel Numericality验证,allow_nil不起作用

# source.rb 
class Source 
field :code, type: Integer 
validates_numericality_of :code, allow_nil: true 

allow_nil的目的是验证领域目前&忽略零值。

但在这里,allow_nil完全绕过numericality检查

object = Source.new 
object.code = "ABC" 
object.valid? 
=> true 
object 
=> #<Source _id: 50d00b2d81ee9eae46000001, _type: nil, code: 0> 

在ActiveRecord的,这正常工作

object = Source.new 
object.code = "ABC" 
object.valid? 
=> false 
object 
=> #<Source id: nil, code: 0, created_at: nil, updated_at: nil> 
object.save 
(0.1ms) begin transaction 
(0.1ms) rollback transaction 
=> false 

回答

0

Mongoid行为与活动记录略有不同的使用#valid什么时候?在已经存在的数据上。活动记录的#有效?将运行所有验证,而Mongoid的#有效?只会在数据已更改为优化的字段上运行验证。 - see mongoid validation

所以这可能是你的问题。

你可以尝试

validates_numericality_of :code, :allow_nil => true

validates :code, :numericality => true ,:allow_nil => true

+0

嗨。感谢您的回复。我不确定我是否理解正确。在上面的代码片段中,这两个示例都是新对象。没有真正更新属性。另外,如果你检查第一行,我使用validates_numercality_of,类似于你的第一个建议。 – Rahul

+0

通过它的外观你试图设置'Source.code =“ABC”'这实际上不会改变'code:0'已经持久化的默认值作为它的'type!= Integer'所以Mongoid将不会在该字段上运行验证。根据我对Mongoid验证的解释 –

+0

是的,有趣的是ActiveRecord按照我的代码片段演示。我将如何让Mongoid失败验证? – Rahul