4

Mongoidで1つのドキュメントを別のドキュメントに埋め込んでいます。

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ソースについての私の理解は最善ではないので、あまりにもハードなmodを蹴らないでください。

この点で、MongoidはActiveRecordに似ていると思います。ActiveRecordでは、を定義し:has_manyても親オブジェクトは変更されませんが、子にアクセスするためのメソッドが含まれます。belongs_to一方、外部キーを管理するためのメソッドをプルします。

Mongoidのソースコードを見ると、永続性は埋め込みクラスから親に呼び出されており、その逆ではないようです(source)。を削除するembedded_inと、子を親に挿入するための追加のメソッドが削除されます。

私が離れている場合は、遠慮なく訂正してください:)

于 2012-11-15T09:10:58.847 に答える
1

ドキュメントを MongoDB に埋め込むことを選択すると、多くのメリットが得られますが、親のコンテキストの外部にあるすべてのものをクエリする機能は放棄されます。親ドキュメントのコンテキスト外で Address ドキュメントを独立して操作できるようにする場合は、ドキュメントをhas_manyで埋め込むのではなく、 でリンクする必要がありますembeds_many。これには、独自の長所と短所があります。

ドキュメントを埋め込むことを選択した場合embedded_inは、モデルで指定し、次のように埋め込まれたドキュメントにアクセスします。

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

(ドキュメント参照)

于 2012-11-18T20:02:20.183 に答える