Rails - Verschachtelte Includes in Active Records?

166

Ich habe eine Liste von Ereignissen, die ich abrufe. Ich versuche, jeden Benutzer, der diesem Ereignis zugeordnet ist, und jedes Profil, das jedem Benutzer zugeordnet ist, einzubeziehen. Die Benutzer werden eingeschlossen, aber nicht ihre Profile.

Wie würde ich das machen?

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

Die Dokumente scheinen nicht klar zu sein: http://guides.rubyonrails.org/active_record_querying.html

aryaxt
quelle

Antworten:

406

Ich glaube, das Folgende sollte für Sie funktionieren.

Event.includes(users: :profile)

Wenn Sie eine Zuordnung (wir nennen sie C) einer bereits enthaltenen Zuordnung (wir nennen sie B) einschließen möchten, verwenden Sie die obige Syntax. Wenn Sie jedoch auch D einschließen möchten, das auch eine Zuordnung von B ist, verwenden Sie das Array wie im Beispiel im Rails-Handbuch angegeben .

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

Sie können solche Includes weiterhin verschachteln (falls dies tatsächlich erforderlich ist). Angenommen, A ist auch mit Z verbunden, und C ist mit E und F verbunden.

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

Und zum Spaß werden wir auch sagen, dass E mit J und X verbunden ist und dass D mit Y verbunden ist.

A.includes( { bees: [ { cees: [ { ees: [:jays, :exes] }, :effs] }, { dees: :wise } ] }, :zees)
Joe Kennedy
quelle
11
Wie würden Sie Bedingungen für die enthaltenen Module hinzufügen? :)
Arup Rakshit
1
Wie füge ich dort eine Bestellung hinzu?
Florian Widtmann
6
Dies ist eine dieser magischen Antworten, die ich im Abstand von mehreren Jahren gefunden habe und die mir jedes Mal den Arsch retten. So sollten die Dokumente aussehen
Andrew
2
Um diesen Leitfaden zum anstrengendsten zu machen: A.includes( { bees: { cees: {:dees, :ees} } })- für die russische puppenähnliche Konstruktion (dh A enthält b, einschließlich c ... usw.)
Alexander Gorg
2
Bedingungen hinzufügenA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio Bertoglio
14

Wenn jemand einen respond_toBlock ausführt, um verschachtelten JSON zu generieren, können Sie Folgendes tun:

respond_to do |f|
  f.json do
    render json: event.to_json(include: {users: {include: :profile} }), status: :ok
  end
end
Blaskovicz
quelle
1
Ich denke du meinst as_json- sonst wird der JSON-String gerendert.
Meekohi
10

Bitte beziehen Sie sich auf die Lösung von Joe Kennedy.

Hier ist ein besser lesbares Beispiel (für zukünftige mich).

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