Rails-Active Recordsにネストされたインクルード?


166

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

どうすればいいですか

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

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

回答:


406

私は次のことがあなたのために働くべきだと思います。

Event.includes(users: :profile)

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

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)

11
含まれているモジュールの条件をどのように追加しますか?:)
Arup Rakshit、2015年

1
そこに注文を追加する方法?
Florian Widtmann、2016年

6
これは、私が何年も離れて発見した魔法の答えの1つであり、毎回お尻を救います。ドキュメントは次のようになります
Andrew

2
このガイドを最も使いにくいものにA.includes( { bees: { cees: {:dees, :ees} } })するには、次のようにします。-建設のようなロシアの人形(つまり、Aにはbが含まれ、cを含むなど)
Alexander Gorg

2
条件を追加するにはA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio Bertoglio

14

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

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

1
私はあなたが意味を考えるas_json-そう、これはJSON文字列をレンダリングします。
Meekohi 2017

10

Joe Kennedyのソリューションを参照してください。

これはより読みやすい例です(将来の私にとって)。

includes(
  :product,
  :package, {
    campaign: [
      :external_records,
      { account: [:external_records] },
      { agency: [:external_records] },
      :owner,
      :partner,
    ]
  }
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.