Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Várias junções de tabela em trilhos


Para reescrever a consulta SQL que você tem em sua pergunta, acho que deveria ser assim (embora eu esteja tendo dificuldade em visualizar completamente seus relacionamentos de modelo, então isso é um pouco de adivinhação):
RagaContextApplicantsSong.
  joins(:raga_contest_applicants => [:raga_content_rounds], :contest_cat).
  group('raga_contest_rounds.contest_cat_id')

...de modo que o joins O método cuida de ambas as junções, bem como do WHERE cláusula, seguida finalmente pelo group ligar.

Mais para referência:

Se você estiver juntando várias associações ao mesmo modelo você pode simplesmente listá-las :
Post.joins(:category, :comments)
Returns all posts that have a category and at least one comment

Se você estiver juntando tabelas aninhadas, poderá listá-las como em um hash:
Post.joins(:comments => :guest)
Returns all comments made by a guest

Associações aninhadas, vários níveis:
Category.joins(:posts => [{:comments => :guest}, :tags])
Returns all posts with their comments where the post has at least one comment made by a guest

Você também pode encadear chamadas da Interface de consulta do ActiveRecord como:
Post.joins(:category, :comments)
...produces the same SQL as...
Post.joins(:category).joins(:comments)

Se tudo mais falhar, você sempre pode passar um fragmento SQL diretamente para as joins método como um trampolim para passar de sua consulta de trabalho para algo mais centrado em ARQI
   Client.joins('LEFT OUTER JOIN addresses ON addresses.client_id = clients.id')
=> SELECT clients.* FROM clients LEFT OUTER JOIN addresses ON addresses.client_id = clients.id