【问题标题】:Mongoid: ActiveModel Numericality Validation, allow_nil does not workMongoid:ActiveModel 数值验证,allow_nil 不起作用
【发布时间】:2012-12-18 06:40:19
【问题描述】:

我已经定义了一个带有整数字段的 Mongoid 模型,我可以像这样验证数值

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

allow_nil 的目的是验证存在的字段并忽略 nil 值。

但是在这里,allow_nil 完全绕过了数字检查

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

【问题讨论】:

    标签: validation mongoid null activemodel


    【解决方案1】:

    在使用#valid 时,Mongoid 的行为与 Active Record 略有不同?在已经持久化的数据上。 Active Record 的#valid?将运行所有验证,而 Mongoid 的 #valid?将仅在数据已更改的字段上运行验证作为优化。 - see mongoid validation

    所以这可能是你的问题。

    你可以试试

    validates_numericality_of :code, :allow_nil =&gt; true

    validates :code, :numericality =&gt; true ,:allow_nil =&gt; true

    【讨论】:

    • 嗨。感谢您的回复。我不确定我是否理解正确。在我上面的 sn-p 中,两个示例都是新对象。并没有真正更新属性。另外,如果您检查第一行,我使用的是 validates_numercality_of,类似于您的第一个建议。
    • 从外观上看,您正在尝试设置Source.code = "ABC",这实际上不会将已经持久的默认值code: 0更改为type != Integer,因此Mongoid不会运行验证在场上。根据我对 Mongoid 验证的解释
    • 是的,有趣的是 ActiveRecord 就像我的 sn-p 演示的那样。如何让 Mongoid 验证失败?
    • 从外观上看,Mongoid 只会对数据已更改的字段运行验证,您可能必须为 mongoid 类设置自定义设置器,即def code = (val) code_will_change! @code = val end
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多