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)

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

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,
    ]
  }
)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.