Docs Menu

ネストされた属性

このガイドでは、ドキュメントとその関連付けに対するデータ操作を可能にするために、モデルにネストされた属性を定義する方法を学習できます。ネストされた属性を定義した後、最上位ドキュメントと関連するドキュメントへの更新を単一のパラメーター ハッシュで指定できます。 これは、アプリケーションで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.

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

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