Validation Mongoid:ActiveModel数值性验证,allow_nil不起作用

Validation Mongoid:ActiveModel数值性验证,allow_nil不起作用,validation,mongoid,null,activemodel,Validation,Mongoid,Null,Activemodel,我已经用一个整数字段定义了一个Mongoid模型,我像这样验证了它的数值性 #source.rb 类源 字段:代码,类型:整数 验证:代码的\u数值性\u,允许\u nil:true allow_nil的目的是验证存在的字段并忽略nil值 但在这里,allow_nil完全绕过了数值性检查 object=Source.new object.code=“ABC” 对象。有效吗? =>正确 对象 => # 在activerecord中,这可以正常工作 object=Source.new obje

我已经用一个整数字段定义了一个Mongoid模型,我像这样验证了它的数值性

#source.rb
类源
字段:代码,类型:整数
验证:代码的\u数值性\u,允许\u nil:true
allow_nil的目的是验证存在的字段并忽略nil值

但在这里,allow_nil完全绕过了数值性检查

object=Source.new
object.code=“ABC”
对象。有效吗?
=>正确
对象
=> # 
在activerecord中,这可以正常工作

object=Source.new
object.code=“ABC”
对象。有效吗?
=>错误
对象
=> #
object.save
(0.1ms)开始事务处理
(0.1ms)回滚事务
=>错误

使用#valid时,Mongoid的行为与活动记录略有不同?在已持久化的数据上。活动记录有效吗?将运行所有验证,而Mongoid是有效的?将仅在数据已作为优化更改的字段上运行验证。-

所以这可能是你的问题

你可以试试

验证:code、:allow\u nil=>true的数值性


验证:code,:numericanity=>true,:allow\u nil=>true

Hi。谢谢你的回复。我不确定我是否理解正确。在我上面的代码片段中,两个示例都是新对象。没有真正更新属性。另外,如果您检查第一行,我使用的是validates_numerability_of,与您的第一个建议类似。从外观上看,您试图设置
Source.code=“ABC”
这实际上不会更改已保存的默认值
code:0
作为其
类型!=整数
因此Mongoid不会对字段运行验证。根据我对Mongoid validationYes的解释,有趣的是,ActiveRecord正如我的代码片段所示。如何使Mongoid验证失败?从外观上看,Mongoid只会在数据已更改的字段上运行验证。您可能需要为Mongoid类设置自定义设置器,即
def code=(val)code\u will\u change@代码=val end