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