Как преобразовать SQL-запрос в Rails Active Record Query? - PullRequest
1 голос
/ 10 августа 2011

Мой последний пост был о лучшем способе написания SQL-запроса с условиями на LEFT OUTER JOIN:
ВЛЕВО НАРУЖНОЕ СОЕДИНИТЬ с условиями (где, по заказу)?

Теперь мне нужно преобразовать этот хороший кусок SQL в полезный Active Record Query (Rails 3). ; -)

У меня есть 2 модели:

Обучение has_many: training_histories

История обучения принадлежит_: обучение

Как мне написать область видимости, чтобы получить результаты, полученные SQL ниже?

SELECT tc.id, tc.name, tc.order, 
th.id as history_id, th.finished_at, th.score
FROM trainings tc
LEFT OUTER JOIN training_histories th ON th.training_id = tc.id 
    and th.id =
    (SELECT th1.id from training_histories th1 where th1.training_id = tc.id
     and th1.finished_at is not null
     order by th1.finished_at desc limit 1)
WHERE tc.id > 4
AND tc.id < 8
GROUP BY tc.id
ORDER BY tc.order_by ASC, tc.id ASC

Я хочу получить все записи TRAININGS и добавить последнюю действительную (или законченную) связанную запись TRAINING_HISTORIES.

Есть предложения?

Спасибо

1 Ответ

7 голосов
/ 10 августа 2011

Для рельсов 3 попробуйте это:

Training.select("trainings.id, trainings.name, trainings.order, 
                 trainings.id AS history_id, training_histories.finished_at,
                 training_histories.score").
         joins("LEFT OUTER JOIN training_histories 
                ON training_histories.training_id = trainings.id 
                AND training_histories.id = (SELECT th1.id FROM training_histories th1          
                                             WHERE th1.training_id = tc.id
                                             AND th1.finished_at IS NOT NULL
                                             ORDER BY th1.finished_at DESC LIMIT 1)").
         where("trainings.id > 4 AND trainings.id < 8").
         group("trainings.id").
         order("trainings.order_by ASC, trainings.id ASC")

По сути, вы просто конвертируете свой предварительно написанный запрос в методы поиска Rails 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...