Rails способ написания этого запроса Mysql - PullRequest
1 голос
/ 08 марта 2012

У меня есть запрос Mysql:

actors_to_delete = find_by_sql("SELECT * FROM `dvd_role` a
LEFT JOIN `dvd_actor2role` b ON a.id = b.`roleId`
LEFT JOIN `dvd_actor` c ON b.`actorId` = c.`id`
WHERE role LIKE '%uncredited%'
GROUP BY c.id")

Я написал это Railsy следующим образом:

actors_to_delete = Role.joins("LEFT JOIN `dvd_actor2role` ON dvd_role.id = dvd_actor2role.`roleId`").joins("LEFT JOIN `dvd_actor` ON dvd_actor2role.`actorId` = dvd_actor.`id`").where("dvd_role.role LIKE '%uncredited%'").group("dvd_actor.id")

Что мне интересно (кроме того, что на самом деле разница между этими двумя запросами, они оба делают одно и то же, так почему же предпочтение Railsy-пути перед более простым SQL-способом?) - как мне написать это с отношениями, которые уже установлены в Rails.

Если я попытаюсь сделать что-то вроде этого:

Actor.actor2role.role.where("role LIKE ?", '%uncredited%')

Я получу неопределенный метод actor2role, потому что, хотя отношения установлены в Rails, они работают для экземпляра Actor, а не для самой модели.

Итак, в заключение, просто интересно, как лучше всего это сделать. Исходя из PHP и Mysql, я склонен выписывать многие из этих вещей в SQL и пытаюсь изменить свои злые пути:)

Редактировать

У меня также есть другая проблема, и это тот факт, что в SQL-запросе я получаю всю информацию из всех трех таблиц, способ Rails по какой-то причине дает мне только таблицу dvd_role.

Как я могу также получить данные из двух других таблиц?

Я смог сделать последнее, добавив .select ("*") в начале. Это подходящий способ:

actors_to_delete = Role.select("*").joins("LEFT JOIN `dvd_actor2role` ON dvd_role.id = dvd_actor2role.`roleId`").joins("LEFT JOIN `dvd_actor` ON dvd_actor2role.`actorId` = dvd_actor.`id`").where("dvd_role.role LIKE '%uncredited%'").group("dvd_actor.id")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...