在Mongoid中,我可以在类型为Hash的字段的属性上设置索引,如下所示:
index({ "details.fullName" => 1 }, { name: "full_name_index" })
我想做的是使用以下内容为这些实体创建验证:
validates "details.fullName", presence: true
不幸的是,这会产生以下错误:
NoMethodError:未定义的方法`details.fullName'for Thing
我是否犯了语法错误,或者Mongoid 3中是否不支持此功能?
答案 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
字段。