2014-10-19 5 views
0

эти две области применения не кажутся цепнойChaining прицелы с соединениями

scope :approved, ->{ with_stage(:approved)} 

который в SQL является

WHERE (pages.stage & 4 <> 0) 

и

scope :with_galleries, ->{ joins("LEFT OUTER JOIN galleries ON galleries.galleriable_type = 'Brand' AND galleries.galleriable_id = page.brand_id").where("galleries.id is NOT NULL") } 

этот охват должен давать только страницы которые имеют галереи (каждая страница имеет один бренд, и каждая марка может иметь много галерей)

если я ЦЕПЬ: with_galleries, кажется, что все остальные условия на pages таблице теряется

Я делаю joins неправильно?

ответ

1

Вы получите более полезный результат, если вы позволите ActiveRecord сделать больше тяжелой работы для вас. В частности, если вы создали ассоциации должным образом, вы должны быть в состоянии написать следующее вместо:

scope :with_galleries, joins(brand: :galleries)

... что дало бы правильно змеевидную сферу.

Это будет зависеть от двух ассоциаций, одной из вашей страницы модели к марке:

'belongs_to: марки'

и один из бренда в галереи ::

has_many :galleries, as: :galleriable

Я вывел настройку модели из запроса, который вы написали, поэтому я, возможно, догадался, что ошибался. Но основным принципом здесь является объявление ваших ассоциаций и возможность создания запросов ActiveRecord (если ваш запрос не является чем-то очень необычным, а ваш нет - вы просто фильтруете в зависимости от наличия связанных записей, общей операции).

+0

спасибо! где я могу прочитать о синтаксисе объединений (бренд:: galleries)? –

+0

Ха! На самом деле синтаксис, который я написал выше, выглядит забавным для меня, поскольку я больше привык к эквивалентному, но более раннему хэш-ракетному стилю: 'joins (: brand =>: galleries)'. Вы можете прочитать об этом в [Руководстве по интерфейсу запроса активной записи] (http://guides.rubyonrails.org/active_record_querying.html). Найдите «Присоединение вложенных ассоциаций». –

0

Вам необходимо построить вторую область действия с помощью Arel. Самый простой подход - создать полный SQL-запрос, который вы хотите представить второй области, а затем вставить его в http://www.scuttle.io/

Смежные вопросы