4

我在 Mongoid 中嵌入了一个文档。

class A < B
  include Mongoid::Document
  embeds_one :shipping_address, class_name: 'Address'

就我而言,我省略了反比关系:

class Address
   # embedded_in :A

为什么会这样,尽管 API 工作正常且完全符合预期:

 address = A.address
 address.zip = 1234

 a.changed? #true

 address.save

 a.changed? #false

文件实际上没有保存

如果我返回embedded_in语句,则保存实际上可以正常工作。

4

2 回答 2

2

我对 Mongoid 来源的理解不是最好的,所以不要把我踢得太硬。

我假设 Mongoid 在这方面类似于 ActiveRecord。使用 ActiveRecord,定义 a:has_many不会更改父对象,但包含访问子对象的方法。belongs_to另一方面,提取管理外键的方法。

查看 Mongoid 的源代码,似乎持久性是从嵌入式类调用到父类,而不是相反()。删除embedded_in将删除将子项插入父项的其他方法。

如果我离题了,请随时纠正我:)

于 2012-11-15T09:10:58.847 回答
1

虽然当您选择在 MongoDB 中嵌入文档时可以获得很多好处,但您确实放弃了查询父上下文之外的所有内容的能力。如果您希望能够在父文档的上下文之外独立使用地址文档,您应该将文档链接到has_many而不是嵌入embeds_many。这有它自己的一套优点和缺点。

如果您选择嵌入文档,请embedded_in在模型中指定并访问嵌入的文档,如下所示:

a = A.new     # Parent document
a.addresses   # Embedded Address documents

文档参考

于 2012-11-18T20:02:20.183 回答