【问题标题】:Multiple table joins in rails导轨中的多个表连接
【发布时间】:2013-04-21 12:40:49
【问题描述】:

如何将下面的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    

我知道如何在两个表上编写连接;但是,我对如何在 3 个表上使用 join 不是很有信心。

【问题讨论】:

    标签: mysql ruby-on-rails activerecord


    【解决方案1】:

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

    RagaContextApplicantsSong.
      joins(:raga_contest_applicants => [:raga_content_rounds], :contest_cat).
      group('raga_contest_rounds.contest_cat_id')
    

    ...这样joins 方法处理两个连接以及WHERE 子句,最后是group 调用。

    更多供参考:

    如果您将多个关联加入到同一模型you can simply list them

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

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

    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 查询接口调用,这样:

    Post.joins(:category, :comments)
    ...produces the same SQL as...
    Post.joins(:category).joins(:comments)
    

    如果所有其他方法都失败了,您始终可以 pass a SQL fragment directly into the joins method 作为垫脚石,让您的工作查询更以 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
    

    【讨论】:

    • 非常感谢您在没有太多信息问题的情况下详细解释它。我是 Rails 新手,在 .net 工作了 6 年之后,我真的很难编写 Rails 代码,但是像你这样的人的帮助让我继续前进.. 再次感谢..
    • 我的荣幸。欢迎来到 Rails 社区。正如 Rubyists 喜欢说的那样MINSWAN
    • 嵌套关联,多级#=> 魔法使用简化的哈希语法Category.joins(posts: [{comments: :guest}, :tags])
    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多