2012-11-03 33 views
4

我有一個文件嵌入在另一個Mongoid。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

你有'包括Mongoid :: Document'在地址類中,對吧?該示例僅顯示兩行。 – platforms

回答

2

我對猿類來源的理解並不是最好的,所以不要踢我太難的mod。

我認爲Mongoid在這方面與ActiveRecord類似。使用ActiveRecord,定義:has_many不會更改父對象,但包含訪問子對象的方法。另一方面,belongs_to提取管理外鍵的方法。

查看Mongoid的源代碼,似乎持久性從嵌入類調用到父類,而不是其他方式(source)。刪除embedded_in將刪除將子項插入父項的其他方法。

隨時糾正我,如果我的路要走:)

+0

查看我對@ platform的帖子的評論。大概刪除這些方法會使其保存爲根文檔 - 但它不會。或者,也許我只是看錯了方向。 –

+0

如果你看看存儲在mongoid'has_and_belongs_to_many'中的原始BSON,你將會看到其中包含'has_and_belongs_to_many'的類正在存儲外鍵(通常是對象類型)。如果你真的想要解決embedded_in調用,你可以強制使用它。創建一個字段':addresses'並在其中存儲一個序列化的Address數組。 – Tsagadai

1

而當你選擇嵌入在MongoDB中的文檔,你可以收穫很多,你就放棄了查詢的內容外的一切能力家長。如果您希望能夠獨立處理地址文檔(除了父文檔的上下文之外),則應該將文檔鏈接到has_many而不是使用embeds_many嵌入。這與它自己的利弊有關。

如果選擇嵌入文件,你指定模型embedded_in並訪問嵌入文檔是這樣的:

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

Documentation Reference

+0

我認爲這是一個好的開始。但是,如果完全是這樣的話,刪除'embedded_in',然後將堅持到頂層。但是運行'Address.count'顯示它沒有。也許應該在這裏拋出錯誤。 –

+0

如果我明白你爲什麼要避免使用'embedded_in',它可能會有所幫助?我從來沒有在Mongoid文檔中看到任何他們沒有使關係相互影響的例子。 – platforms

+0

有[此提](http://mongoid.org/en/mongoid/docs/relations。html#has_and_belongs_to_many)是文檔中的片面關係,但它是使用'has_and_belongs_to_many'的多對多參照關係,而不是嵌入文檔。 – platforms