2016-10-02 12 views
2

Итак, я смущен тем, как ActiveRecord справляется с этим, и надеялся, что кто-то может дать мне некоторое представление.Полиморфные отношения путаницы

У меня есть таблица, которая имеет полиморфные отношения. Мы будем называть это выбором таблицы. Там я определил:

belongs_to :chooseable, polymorphic: true 

У меня есть две модели, позвоним один фильм, а остальные игры. Там, у меня есть: has_many :choices as: chooseable, dependent: destroy

В модели с полиморфной отношений у меня есть две области:

scope :with_movies, -> { 
    includes(:movies) 
     .where("chooseable_type": "Measure") 
    } 
    scope :with_shows, -> { 
    includes(:shows) 
     .where(shows: { hidden: false }) 
    } 

Что сбивает с толку меня, если я говорю users.choices.with_movies, и я оставляю вне chooseable_type, где состояние, AR брусьев на меня и говорит:

Unknown column 'choices.chooseable_type' in 'where clause': SELECT `movies`.* FROM `movies` WHERE `choices`.`chooseable_type` = 'Movie' AND `movies`.`id` IN (728) 

Тем не менее, во второй области видимости with_shows, мне не нужно определить chooseable_type - она ​​отлично работает. Еще более запутанным является то, что если я удаляю предложение where, with_shows, не работает.

Я действительно не понимаю, почему предложение where во втором поле позволяет генерировать правильный запрос, но без него он падает на его лицо.

ответ

0

Проблема заключается в том, что Rails пытается сделать это лучше всего строить результирующий сложный запрос для вас, и он решает

.where("chooseable_type": "Measure") 

ему лучше предположение, что основная таблица для этого запроса. Помогите ему не удастся, указать имя таблицы в явном виде:

.where("movies.chooseable_type": "Measure") 
+0

Так, потому что другая сфера имеет где положение для таблицы, он знает, чтобы применить пункт chooseable_type к таблице, даже если он не прямо сказать это? Это так странно для меня. – Siraris

+0

Попробуйте 'puts with_shows.to_sql', чтобы увидеть построенный запрос. – mudasobwa