轨道中的多个表连接

pra*_*ech 22 mysql activerecord ruby-on-rails

我如何在mysql查询下写入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    
Run Code Online (Sandbox Code Playgroud)

我知道如何在两个表上编写连接,对如何在3个表上使用连接不太自信.

jef*_*unt 67

要重写你在问题中得到的SQL查询,我认为它应该如下(尽管我很难完全可视化你的模型关系,所以这有点猜测):

RagaContextApplicantsSong.
  joins(:raga_contest_applicants => [:raga_content_rounds], :contest_cat).
  group('raga_contest_rounds.contest_cat_id')
Run Code Online (Sandbox Code Playgroud)

...这样该joins方法既可以处理两个连接,也可以处理WHERE子句,最后是group调用.

作为参考更多:

如果您要将多个关联加入同一个模型,您只需列出它们:

Post.joins(:category, :comments)
Returns all posts that have a category and at least one comment
Run Code Online (Sandbox Code Playgroud)

如果要加入嵌套表,可以将它们列为哈希:

Post.joins(:comments => :guest)
Returns all comments made by a guest
Run Code Online (Sandbox Code Playgroud)

嵌套关联,多级:

Category.joins(:posts => [{:comments => :guest}, :tags])
Returns all posts with their comments where the post has at least one comment made by a guest
Run Code Online (Sandbox Code Playgroud)

您还可以链接ActiveRecord查询接口调用,以便:

Post.joins(:category, :comments)
...produces the same SQL as...
Post.joins(:category).joins(:comments)
Run Code Online (Sandbox Code Playgroud)

如果所有其他方法都失败了,您总是可以将SQL片段直接传递给joins方法,作为从工作查询中获取更多以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
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你花了很多精力来解释它而没有太多信息.我刚接触过rails,在.net工作了6年后,我真的很难有时间编写rails方式,但像你这样的人的帮助让我继续......再次感谢.. (3认同)
  • 嵌套关联,多级 #=> Wizardry 使用简化的哈希语法`Category.joins(posts: [{comments: :guest}, :tags])` (3认同)