是否可以使用mongoid"嵌套属性"从belongs_to方面的一对多关系?

时间:2011-12-20 17:34:42

标签: ruby mongodb mongoid

是否可以使用属于一对一关系的belongs_to方面的mongoid“nested attributes”?

示例:

class Bar1
  include Mongoid::Document

  belongs_to :bar2

  accepts_nested_attributes_for :bar2
end

当我试图访问嵌套属性时,我得到以下异常:NoMethodError:undefined method`bar2_attributes'

我的主要目的是使用“嵌套属性”功能来缓存引用的文档属性。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

当您应该使用数组访问方法时,您可能会尝试以Class.attr之类的方式访问它:class['attr']。我的猜测是,即使它不是一个动态字段,规则仍然适用,因为它是嵌套的,可能还不存在。

来自mongoid docs

  

默认情况下,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)。

如果未设置值,则引发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,可以完全关闭动态属性。

答案 1 :(得分:1)

我再次阅读了文档,现在明白“嵌套属性”用于保存数据。并且不能用于引用文档的缓存。