Mongoid:如何在Hash字段上验证特定键的值?

时间:2014-12-22 18:31:46

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

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

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

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

validates "details.fullName", presence: true

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

  

NoMethodError:未定义的方法`details.fullName'for Thing

我是否犯了语法错误,或者Mongoid 3中是否不支持此功能?

2 个答案:

答案 0 :(得分:5)

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

validate :details_has_full_name

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

答案 1 :(得分:5)

您确定要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本身而言,嵌入式文档仍然是一个哈希,因此索引和存储将是相同的,唯一的区别是Mongoid会对details内部有所了解,并且会有_id内常见的details字段。