web-dev-qa-db-ja.com

Rails-ネストされたアクティブレコードのインクルード?

取得するイベントのリストがあります。このイベントに関連付けられているすべてのユーザーと、各ユーザーに関連付けられているすべてのプロファイルを含めるようにしています。ユーザーは含まれますが、プロファイルは含まれません。

どうすればいいですか

Event.includes(:users [{profile:}])

ドキュメントは明確ではないようです: http://guides.rubyonrails.org/active_record_querying.html

143
aryaxt

私は次のことがうまくいくと信じています。

Event.includes(users: :profile)

すでに含まれている関連付け(Bと呼ぶ)の関連付け(Cと呼ぶ)を含めたい場合は、上記の構文を使用します。ただし、Bの関連付けでもあるDも含めたい場合は、 Rails Guide の例にあるように配列を使用します。

A.includes(bees: [:cees, :dees])

そのようなインクルードをネストし続けることができます(実際に必要な場合)。 AはZにも関連付けられ、CはEおよびFに関連付けられているとします。

A.includes( { bees: [ { cees: [:ees, :effs] }, :dees] }, :zees)

また、楽しくするために、EはJとXに関連付けられ、DはYに関連付けられているとも言います。

A.includes( { bees: [ { cees: [ { ees: [:jays, :exes] }, :effs] }, { dees: :wise } ] }, :zees)
359
Joe Kennedy

誰かがrespond_toブロックを実行してネストされたjsonを生成している場合、次のようなことができます:

respond_to do |f|
  f.json do
    render json: event.to_json(include: {users: {include: :profile} }), status: :ok
  end
end
11
Blaskovicz

ジョーケネディのソリューションを参照してください。

ここに、より読みやすい例があります(将来の私のために)。

includes(
  :product,
  :package, {
    campaign: [
      :external_records,
      { account: [:external_records] },
      { agency: [:external_records] },
      :owner,
      :partner,
    ]
  }
)
1
aschyiel