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

Rails named_scopes с объединениями

Я пытаюсь создать 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' "
  }

(A Клип принадлежит Серии, серия принадлежит Шоу, Шоу может быть видимым или невидимым).

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 с идентификатором, который не находится в базе данных, вместо этого он отобрал идентификатор шоу. Где я ошибаюсь?

4b9b3361

Ответ 1

Проблема заключается в том, что "SELECT *" - запрос берет все столбцы из клипов, сериалов и шоу в этом порядке. Каждая таблица имеет столбец идентификатора и приводит к конфликтам между именованными столбцами в результатах. Последний столбец id, отброшенный назад (из шоу), переопределяет ту, которую вы хотите. Вы должны использовать параметр: select с помощью: join, например:

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' "
}