27

以下のmysqlクエリをレールアクティブレコードに書き込むにはどうすればよいですか

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    

2 つのテーブルに結合を記述する方法を知っています。ただし、3つのテーブルで結合を使用する方法についてはあまり自信がありません。

4

1 に答える 1

75

質問で得た SQL クエリを書き直すには、次のようにする必要があると思います (ただし、モデルの関係を完全に視覚化するのに苦労しているため、これは少し当て推量です)。

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

...joinsメソッドが2つの結合と句の両方を処理し、最後に呼び出しWHEREが続くようにします。group

参考までに:

複数のアソシエーションを同じモデルに結合している場合は、それらを簡単にリストできます:

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 Query Interface 呼び出しをチェーンすることもできます。

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

他のすべてが失敗した場合は、作業中のクエリからより ARQI 中心のものに移行するための足がかりとして、いつでも SQL フラグメントをメソッドに直接渡すことができます。joins

   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
于 2013-04-21T13:11:32.683 に答える