【问题标题】:Mongoid: How to validate value of specific key on Hash field?Mongoid:如何验证哈希字段上特定键的值?
【发布时间】:2014-12-22 18:31:45
【问题描述】:

在 Mongoid 中,我可以在类型为 Hash 的字段的属性上设置索引,如下所示:

index({ "details.fullName" => 1 }, { name: "full_name_index" })

我想做的是使用以下内容为此类实体创建验证:

validates "details.fullName", presence: true

不幸的是,这会产生以下错误:

NoMethodError:Thing 的未定义方法“details.fullName”

是我犯了语法错误,还是 Mongoid 3 根本不支持此功能?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid mongoid3


    【解决方案1】:

    由于 Hash 数据类型是非结构化的哈希值(即它没有对哈希内的键的任何引用,您可以将任何哈希字符串粘贴在那里),您必须编写自定义验证方法:

    validate :details_has_full_name
    
    def details_has_full_name
        errors.add(:details, "Some Error Message") if details["fullName"].nil?
    end
    

    【讨论】:

      【解决方案2】:

      你确定你想让details 成为一个简单的哈希吗?如果它有结构,那么它可能应该是一个嵌入式文档。然后您将验证放入该嵌入文档中。

      class Whatever
        include Mongoid::Document
        embeds_one :details
        validates :details, :presence => true
      end
      class Detail
        include Mongoid::Document
        embedded_in :whatever
        field :fullName
        validates :fullName, :presence => true
      end
      

      就 MongoDB 本身而言,嵌入的文档仍然是一个 Hash,因此索引和存储是相同的,唯一的区别是 Mongoid 会知道一些关于 details 内部的信息,并且会有通常的_id details 内的字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-04
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多