是否可以使用monid "嵌套属性"从belongs_to一方的一对一关系?
的例子:
class Bar1
include Mongoid::Document
belongs_to :bar2
accepts_nested_attributes_for :bar2
end
当我试图访问嵌套的属性,我得到以下例外:NoMethodError:未定义的方法' bar2_attributes'
我的主要目标是使用"嵌套属性"特性来缓存引用的文档属性。
我做错了什么?
当您应该使用数组访问方法:class['attr']
时,您可能会尝试访问它作为Class.attr
的方法。我的猜测是,即使它不是一个动态字段,规则仍然适用,因为它是嵌套的,可能还不存在。
来自mongoid docs
默认情况下,Mongoid支持动态字段——也就是说,即使没有为属性定义字段,它也允许在文档中设置属性并将其持久化。但是,在处理动态属性时,Mongoid对method_missing的使用并不完全宽容,并且破坏了Document类的公共接口。当处理动态属性时,以下规则适用:如果文档中存在该属性,那么Mongoid将为您提供标准的getter和setter方法。例如,考虑一个人,他在文档中设置了一个属性"gender":
设置人的性别为男性。
person[:gender] = "Male"
person.gender = "Male"
获取此人的性别。
person.gender
如果该属性在文档中不存在,Mongoid将不会为您提供getter和setter,并强制执行正常的method_missing行为。在这种情况下,您必须使用其他提供的访问方法:([]和[]=)或(read_attribute和write_attribute)。
如果未设置值则引发NoMethodError。
person.gender
person.gender = "Male"
安全地检索动态字段。
person[:gender]
person.read_attribute(:gender)
安全地写动态字段。
person[:gender] = "Male"
person.write_attribute(:gender, "Male")
动态属性可以通过将Mongoid配置选项allow_dynamic_fields设置为false来完全关闭。
我又读了一遍文档,现在明白了"netsted attributes"是用来保存数据的。并且不能用于缓存引用的文档。