Rails 中的多个表连接
如何将下面的 mysql 查询写入 rails activerecord
How do I write the mysql query below into rails activerecord
select
A.*,
B.*
from
raga_contest_applicants_songs AS A
join
raga_contest_applicants AS B
ON B.contest_applicant_id = A.contest_applicant_id
join
raga_contest_rounds AS C
ON C.contest_cat_id = B.contest_cat_id
WHERE
C.contest_cat_id = contest_cat_id
GROUP BY
C.contest_cat_id
我知道如何在两个表上编写连接;但是,我对如何在 3 个表上使用连接不是很有信心.
I know how to write joins on two tables; however, I'm not very confident on how to use join on 3 tables.
推荐答案
要重写您的问题中的 SQL 查询,我认为它应该如下所示(尽管我很难完全可视化您的模型关系,所以这有点猜测):
To rewrite the SQL query you've got in your question, I think it should be like the following (though I'm having a hard time fully visualizing your model relationships, so this is a bit of guesswork):
RagaContextApplicantsSong.
joins(:raga_contest_applicants => [:raga_content_rounds], :contest_cat).
group('raga_contest_rounds.contest_cat_id')
...这样 joins
方法处理两个连接以及 WHERE
子句,最后是 group代码>调用.
...such that the joins
method takes care of both of the two joins as well as the WHERE
clause, followed finally by the group
call.
更多供参考:
如果您将多个关联加入同一模型您可以简单地列出它们一个>:
If you're joining multiple associations to the same model you can simply list them:
Post.joins(:category, :comments)
Returns all posts that have a category and at least one comment
如果您要加入嵌套表,您可以将它们以散列形式列出:
If you're joining nested tables you can list them as in a hash:
Post.joins(:comments => :guest)
Returns all comments made by a guest
嵌套关联,多级:
Category.joins(:posts => [{:comments => :guest}, :tags])
Returns all posts with their comments where the post has at least one comment made by a guest
您还可以链接 ActiveRecord 查询接口调用,例如:
You can also chain ActiveRecord Query Interface calls such that:
Post.joins(:category, :comments)
...produces the same SQL as...
Post.joins(:category).joins(:comments)
如果所有其他方法都失败了,您可以随时直接传递 SQL 片段进入 joins
方法 作为从你的工作查询到更以 ARQI 为中心的东西的垫脚石
If all else fails you can always pass a SQL fragment directly into the joins
method as a stepping stone to getting from your working query to something more ARQI-centric
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
相关文章