AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

ネストされた属性の使用

このガイドでは、ドキュメントとその関連付けに対するデータ操作を可能にするために、モデルにネストされた属性を定義する方法を学習できます。ネストされた属性を定義した後、最上位ドキュメントと関連するドキュメントへの更新を単一のパラメーター ハッシュで指定できます。 これは、アプリケーションで1 つのフォーム内で複数のドキュメントを編集する必要がある場合に役立つ場合があります。

埋め込みまたは参照された任意の関連付けに対してネストされた属性を有効にできます。 関連付けにネストされた属性を追加するには、 モデルクラスを定義する ときに、accepts_nested_attributes_for マイクロに関連付け名を指定します。

次のコードは、Band モデルクラスの埋め込み関連付けを定義し、accepts_nested_attributes_for マニュアルを含みます。

class Band include Mongoid::Document embeds_many :albums belongs_to :producer accepts_nested_attributes_for :albums, :producerend

注意

自動保存 有効

参照先の関連付けにネストされた属性機能を追加すると、Mongoid はその関連付けのオート保存を自動的に有効にします。

関連付けでネストされた属性の動作を有効にすると、Mongoid は基本モデルに特別なメソッドを追加します。 このメソッドを使用して属性を更新できます。

メソッド名は、_attributes が付属する関連付け名です。 例、producers の関連付けを更新するための setter メソッドは producer_attributes です。

このメソッドを直接使用することも、最上位クラスの更新でメソッドの名前を属性として使用することもできます。 この場合、Mongoid は適切な setter メソッドを内部的に呼び出します。

次のコードは、Band のインスタンスを検索し、ネストされた属性アップデート メソッド producer_attributes を使用して 関連付けドキュメントの 値を設定します。

# Retrieves a Band instanceband = Band.where(name: 'Tennis').first# Updates the "producer" associationband.producer_attributes = { name: 'Alaina Moore' }

ネストされた属性をアップデートするには、複数の方法があります。

  • <association name>_attributes setter メソッドを使用します。

  • 関連付けを更新するには、attributes セッター メソッドを使用し、値で <association name>_attributes を指定します。

  • update_attributes セッター メソッドを使用し、 値で属性名を指定して関連付けを更新します。

  • 関連付けを更新するには、update メソッドを使用し、値で <association name>_attributes を指定します。

  • 関連付けを作成するには、create メソッドを使用し、値で <association name>_attributes を指定します。

注意

リパレンティング動作

Mongoid v9.0.x では、Mongoid::Config.allow_reparenting_via_nested_attributes オプションのデフォルトは true です。true の場合、ネストされた属性を介して別の親に既に属している子を割り当てると、子は参照された has_many 関連付けで新しい親に移動します。

Mongoid v9.1 以降では、 オプションはデフォルトで false になり、この再割り当ては効果がありません。v9.0.x を保持するにはv9.1 に移行した後の 動作には、 オプションを true に設定します。

Mongoid v10 はこのオプションを除く、false を唯一の動作にします。

次の例は、単一のステートメントで関連付けられた album レコードを持つ Bandインスタンスを作成する方法を示しています。

band = Band.create( name: 'Tennis', albums_attributes: [ { name: 'Swimmer', year: 2020 }, { name: 'Young & Old', year: 2013 }])

ネストされた属性機能を使用して、新しいネストされたドキュメントを作成できます。 ドキュメントを作成するときは、_idフィールドを省略します。 次のコードでは、update メソッドを使用して、既存の Bandインスタンスにネストされた albumドキュメントを作成します。

band = Band.where(name: 'Vampire Weekend').firstband.update(albums_attributes: [ { name: 'Contra', year: 2010 } ])

このアクションは、既存のネストされたドキュメントを変更せずに新しいドキュメントを既存のセットに追加します。

ネストされた属性機能を使用して、ネストされた既存のドキュメントを更新できます。 属性を使用してネストされたドキュメントを更新するよう Mongoid に指示するには、ドキュメントの _id 値を update メソッドに渡します。 次の例では、 albums エントリの _id 値を使用して yearフィールド を更新します。

band = Band.where(name: 'Vampire Weekend').first# Retrieves the first entry from the albums arrayalbum = band.albums.first# Updates the entry by passing the _id valueband.update(albums_attributes: [ { _id: album._id, year: 2011 } ])

重要

Mongoid が指定された _id 値を持つドキュメントと一致しない場合、Mongoid::Errors::DocumentNotFound 例外が発生します。

update メソッドに _destroy 属性を指定すると、ネストされたドキュメントを削除できます。 ネストされたドキュメントの削除を有効にするには、次のコードに示すように、accepts_nested_attributes_for 宣言に allow_destroy: true を設定する必要があります。

class Band # ... accepts_nested_attributes_for :albums, allow_destroy: trueend

次のコードでは、_destroy属性を使用して、Bandインスタンスの最初の albums エントリを削除します。

band = Band.where(name: 'Vampire Weekend').first# Retrieves the first entry from the albums arrayalbum = band.albums.first# Deletes the entry by passing the _id valueband.update(albums_attributes: [ { _id: album._id, _destroy: true } ])

重要

一致するドキュメントはありません

Mongoid が指定された _id 値を持つドキュメントと一致しない場合、Mongoid::Errors::DocumentNotFound 例外が発生します。

ネストされた属性機能を使用して、ネストされたドキュメントに対して複数のデータ操作を実行できます。

次のコードは、ネストされたドキュメントを作成し、既存のドキュメントを更新し、Bandインスタンスの albums 配列内のドキュメントを削除します。

band = Band.where(name: 'Yeah Yeah Yeahs').first# Performs multiple data changesband.update(albums_attributes: [ { name: 'Show Your Bones', year: 2006 }, { _id: 1, name: 'Fever To T3ll' }, { _id: 2, _destroy: true } ])

クエリについて詳しくは、「ドキュメント クエリの指定」ガイドを参照してください。

CRUD操作の実行の詳細については、CRUD操作ガイドを参照してください。

関連付けの詳細については、次のガイドを参照してください。