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

Aus*_*ork 3 ruby-on-rails mongodb mongoid ruby-on-rails-3 mongoid3

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

index({ "details.fullName" => 1 }, { name: "full_name_index" })
Run Code Online (Sandbox Code Playgroud)

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

validates "details.fullName", presence: true
Run Code Online (Sandbox Code Playgroud)

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

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

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

tag*_*ncy 5

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

validate :details_has_full_name

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


mu *_*ort 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
Run Code Online (Sandbox Code Playgroud)

就MongoDB本身而言,嵌入文档仍然是一个哈希,因此索引和存储将是相同的,唯一的区别是Mongoid会知道details内部的内容,并且内部会有通常的_id字段details.