Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Mongoid:如何验证散列字段上特定键的值?_Ruby On Rails_Ruby On Rails 3_Mongodb_Mongoid_Mongoid3 - Fatal编程技术网

Ruby on rails Mongoid:如何验证散列字段上特定键的值?

Ruby on rails Mongoid:如何验证散列字段上特定键的值?,ruby-on-rails,ruby-on-rails-3,mongodb,mongoid,mongoid3,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:Thing的未定义方法'details.fullName' 我是否犯了语法错误,或者Mongo

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

index({ "details.fullName" => 1 }, { name: "full_name_index" })
我想做的是使用以下方法为此类实体创建验证:

validates "details.fullName", presence: true
不幸的是,这会产生以下错误:

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


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

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

validate :details_has_full_name

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

确实要将
详细信息
作为简单哈希吗?如果它有结构,那么它可能应该是一个嵌入式文档。然后将验证放在嵌入的文档中

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将了解一些关于
详细信息
内部的信息,并且
详细信息
中会有通常的
\u id
字段