Rails - ¿Anidado incluye en registros activos?

Respuestas:

406

Creo que lo siguiente debería funcionar para usted.

Event.includes(users: :profile)

Si desea incluir una asociación (la llamaremos C) de una asociación ya incluida (la llamaremos B), usaría la sintaxis anterior. Sin embargo, si también desea incluir D, que también es una asociación de B, es cuando usaría la matriz como se muestra en el ejemplo de la Guía de Rails .

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

Podrías continuar anidando las cosas así (si realmente lo necesitas). Digamos que A también está asociado con Z, y que C está asociado con E y F.

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

Y para divertirnos, también diremos que E está asociado a J y X, y que D está asociado a Y.

A.includes( { bees: [ { cees: [ { ees: [:jays, :exes] }, :effs] }, { dees: :wise } ] }, :zees)
Joe Kennedy
fuente
11
¿Cómo agregaría condiciones para los módulos incluidos? :)
Arup Rakshit
1
¿Cómo agregar allí un pedido?
Florian Widtmann el
66
Esta es una de esas respuestas mágicas que he encontrado varias veces por años y me salva el culo cada vez. Así es como deberían verse los documentos
Andrew
2
Para que esta guía sea la más agotadora: A.includes( { bees: { cees: {:dees, :ees} } })- para la construcción de muñecas rusas (es decir, A incluye b, que incluye c ... y así sucesivamente)
Alexander Gorg
2
agregar condicionesA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio Bertoglio
14

Si alguien está haciendo un respond_tobloque para generar json anidados, puede hacer algo como:

respond_to do |f|
  f.json do
    render json: event.to_json(include: {users: {include: :profile} }), status: :ok
  end
end
Blaskovicz
fuente
1
Creo que te refieres a que as_json, de lo contrario, esto representa la cadena JSON.
Meekohi el
10

Consulte la solución de Joe Kennedy.

Aquí hay un ejemplo más legible (para mi futuro).

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