У меня есть запрос 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")