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