Rails - Inclui aninhados no Active Records?

Respostas:

406

Eu acredito que o seguinte deve funcionar para você.

Event.includes(users: :profile)

Se você deseja incluir uma associação (denominada C) de uma associação já incluída (denominada B), use a sintaxe acima. No entanto, se você também deseja incluir D, que também é uma associação de B, é nesse momento que você usa a matriz, conforme indicado no exemplo do Guia do Rails .

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

Você pode continuar a aninhar inclusões assim (se realmente precisar). Digamos que A também esteja associado a Z e que C esteja associado a E e F.

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

E, para se divertir, também diremos que E está associado a J e X, e que D está associado a Y.

A.includes( { bees: [ { cees: [ { ees: [:jays, :exes] }, :effs] }, { dees: :wise } ] }, :zees)
Joe Kennedy
fonte
11
Como você adicionaria condições para os módulos incluídos ..? :)
Arup Rakshit
1
como adicionar um pedido?
Florian Widtmann 12/01
6
Esta é uma daquelas respostas mágicas que eu encontrei várias vezes com anos de diferença e sempre me salva. É assim que os documentos devem se parecer #
Andrew # /
2
Para tornar este guia o mais desgastante um: A.includes( { bees: { cees: {:dees, :ees} } })- para a boneca russa como a construção (ou seja, A inclui b, que inclui c ... e assim por diante)
Alexander Gorg
2
para adicionar condiçõesA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio Bertoglio
14

Se alguém estiver fazendo um respond_tobloco para gerar json aninhado, você pode fazer algo como:

respond_to do |f|
  f.json do
    render json: event.to_json(include: {users: {include: :profile} }), status: :ok
  end
end
Blaskovicz
fonte
1
Eu acho que você quer dizer as_json- caso contrário, isso renderiza a string JSON.
Meekohi
10

Por favor, consulte a solução de Joe Kennedy.

Aqui está um exemplo mais legível (para o futuro eu).

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