是否可以从一对多关系的一侧使用Mongoid "nested attributes" belongs_to?



是否可以使用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"是用来保存数据的。并且不能用于缓存引用的文档。

最新更新