Подтвердить что ты не робот

Несколько табличных соединений в рельсах

Как мне написать запрос 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 столах.

4b9b3361

Ответ 1

Чтобы переписать SQL-запрос, который у вас есть в вашем вопросе, я думаю, он должен выглядеть следующим образом (хотя мне сложно полностью визуализировать ваши отношения с моделью, так что это немного догадки):

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

..., так что метод joins выполняет оба этих объединения, а также предложение 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 таким образом, чтобы:

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

Если все остальное не удается, вы всегда можете передать фрагмент 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