是否可以使用属于一对一关系的belongs_to方面的mongoid“nested attributes”?
示例:
class Bar1
include Mongoid::Document
belongs_to :bar2
accepts_nested_attributes_for :bar2
end
当我试图访问嵌套属性时,我得到以下异常:NoMethodError:undefined method`bar2_attributes'
我的主要目的是使用“嵌套属性”功能来缓存引用的文档属性。
我做错了什么?
答案 0 :(得分:1)
当您应该使用数组访问方法时,您可能会尝试以Class.attr
之类的方式访问它:class['attr']
。我的猜测是,即使它不是一个动态字段,规则仍然适用,因为它是嵌套的,可能还不存在。
默认情况下,Mongoid支持动态字段 - 即使没有为它们定义字段,它也允许在文档上设置和保留属性。然而,当处理动态属性时,有一个轻微的“陷阱”,因为Mongoid对于使用method_missing并破坏Document类的公共接口并不完全宽容。 处理动态属性时,以下规则适用: 如果文档中存在该属性,Mongoid将为您提供标准的getter和setter方法。例如,考虑在文档上设置了“性别”属性的人:
person[:gender] = "Male"
person.gender = "Male"
person.gender
如果文档上尚不存在该属性,Mongoid将不会为您提供getter和setter,并将强制执行正常的method_missing行为。在这种情况下,您必须使用其他提供的访问器方法:([]和[] =)或(read_attribute和write_attribute)。
person.gender
person.gender = "Male"
person[:gender]
person.read_attribute(:gender)
person[:gender] = "Male"
person.write_attribute(:gender, "Male")
通过将Mongoid配置选项allow_dynamic_fields设置为false,可以完全关闭动态属性。
答案 1 :(得分:1)
我再次阅读了文档,现在明白“嵌套属性”用于保存数据。并且不能用于引用文档的缓存。