Mongoid save在没有embedded_in关系的情况下无声地失败

时间:2012-11-03 00:40:06

标签: mongoid embed

我在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语句,则保存实际上可以正常工作。

2 个答案:

答案 0 :(得分:2)

我对Mongoid源码的理解并不是最好的,所以不要踢我太硬的mods。

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

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

如果我离开,请随意纠正我:)

答案 1 :(得分:1)

虽然当您选择在MongoDB中嵌入文档时可以获得很多收益,但您确实放弃了查询父级上下文之外的所有内容的功能。如果您希望能够在父文档的上下文之外独立使用地址文档,则应将文档与has_many链接,而不是嵌入embeds_many。这有其自身的优点和缺点。

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

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

Documentation Reference