ネストされた属性
Overview
このガイドでは、ドキュメントとその関連付けに対するデータ操作を可能にするために、モデルにネストされた属性を定義する方法を学習できます。ネストされた属性を定義した後、最上位ドキュメントと関連するドキュメントへの更新を単一のパラメーター ハッシュで指定できます。 これは、アプリケーションで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, :producer end
注意
自動保存 有効
参照先の関連付けにネストされた属性機能を追加すると、Mongoid はその関連付けのオート保存を自動的に有効にします。
関連付けでネストされた属性の動作を有効にすると、Mongoid は基本モデルに特別なメソッドを追加します。 このメソッドを使用して属性を更新できます。
メソッド名は、_attributes
が付属する関連付け名です。 例、producers
の関連付けを更新するための setter メソッドは producer_attributes
です。
このメソッドを直接使用することも、最上位クラスの更新でメソッドの名前を属性として使用することもできます。 この場合、Mongoid は適切な setter メソッドを内部的に呼び出します。
次のコードは、Band
のインスタンスを検索し、ネストされた属性アップデート メソッド producer_attributes
を使用して 関連付けドキュメントの 値を設定します。
# Retrieves a Band instance band = Band.where(name: 'Tennis').first # Updates the "producer" association band.producer_attributes = { name: 'Alaina Moore' }
ネストされた属性をアップデートするには、複数の方法があります。
<association name>_attributes
setter メソッドを使用します。関連付けを更新するには、
attributes
セッター メソッドを使用し、値で<association name>_attributes
を指定します。update_attributes
セッター メソッドを使用し、 値で属性名を指定して関連付けを更新します。関連付けを更新するには、
update
メソッドを使用し、値で<association name>_attributes
を指定します。関連付けを作成するには、
create
メソッドを使用し、値で<association name>_attributes
を指定します。
次の例は、単一のステートメントで関連付けられた 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').first band.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 array album = band.albums.first # Updates the entry by passing the _id value band.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: true end
次のコードでは、_destroy
属性を使用して、Band
インスタンスの最初の albums
エントリを削除します。
band = Band.where(name: 'Vampire Weekend').first # Retrieves the first entry from the albums array album = band.albums.first # Deletes the entry by passing the _id value band.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 changes band.update(albums_attributes: [ { name: 'Show Your Bones', year: 2006 }, { _id: 1, name: 'Fever To T3ll' }, { _id: 2, _destroy: true } ])
詳細情報
To learn more about querying, see the ドキュメントクエリの指定 guide.