Essa é mais uma pergunta "por que as coisas funcionam dessa maneira" em vez de uma pergunta "não sei como fazer isso" ...
Portanto, o evangelho sobre a obtenção de registros associados que você sabe que usará é o de usar, :include
porque você se unirá e evitará um monte de consultas extras:
Post.all(:include => :comments)
No entanto, quando você olha para os logs, não há associação acontecendo:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Ele está pegando um atalho porque ele puxa todos os comentários de uma vez, mas ainda não é uma junção (que é o que toda a documentação parece dizer). A única maneira de obter uma associação é usar em :joins
vez de :include
:
Post.all(:joins => :comments)
E os logs mostram:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Estou esquecendo de algo? Eu tenho um aplicativo com meia dúzia de associações e, em uma tela, exibo dados de todas elas. Parece que seria melhor ter uma consulta ingressada em vez de 6 indivíduos. Sei que em termos de desempenho nem sempre é melhor fazer uma junção do que consultas individuais (na verdade, se você estiver gastando o tempo gasto, parece que as duas consultas individuais acima são mais rápidas que a junção), mas depois de todos os documentos Estou lendo, fico surpreso ao ver que :include
não está funcionando como anunciado.
Talvez o Rails esteja ciente do problema de desempenho e não participe, exceto em certos casos?
includes
(para quem estiver lendo isso) #