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>_attributessetter メソッドを使用します。関連付けを更新するには、
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 } ])
詳細情報
クエリの詳細については、「 ドキュメントクエリの指定 」ガイドをご覧ください。