Рельсы named_scopes с соединениями
-
03-07-2019 - |
Вопрос
Я пытаюсь создать named_scope, который использует соединение, но, хотя сгенерированный SQL выглядит правильно, результат - мусор. Например:
class Clip < ActiveRecord::Base
named_scope :visible, {
:joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id",
:conditions=>"shows.visible = 1 AND clips.owner_type = 'Series' "
}
(клип принадлежит серии, серия принадлежит шоу, шоу может быть видимым или невидимым).
Clip.all делает:
SELECT * FROM `clips`
Clip.visible.all делает:
SELECT * FROM `clips` INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id WHERE (shows.visible = 1 AND clips.owner_type = 'Series' )
Это выглядит хорошо. Но получившийся массив моделей Clip включает в себя Clip с идентификатором, которого нет в базе данных - вместо этого он взял идентификатор шоу. Куда я иду не так?
Решение
Проблема в том, что " SELECT * " - запрос выбирает все столбцы из клипов, серий и показывает в указанном порядке. Каждая таблица имеет столбец идентификатора, что приводит к конфликтам между именованными столбцами в результатах. Последний извлеченный столбец идентификаторов (из шоу) переопределяет тот, который вы хотите. Вы должны использовать опцию: select с: joins, например:
named_scope :visible, {
:select => "episodes.*",
:joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id",
:conditions=>"shows.visible = 1 AND clips.owner_type = 'Series' "
}