Вот моя основная иерархия моделей:
Movie has many Listings and many Links through Listings
Listing has many Links
Link has a price (float)
Я пытаюсь выбрать все фильмы, которые имеют ссылки с ценой = 0,00.
Я легко делаю это с помощью областей:
scope :free, lambda{
joins(:links).where('links.price = ?', 0.00)
.group('movies.id')
}
Это все хорошо, если предоставить мне список фильмов с бесплатными ссылками, но когда я просматриваю и смотрю на Movie.links
, он дает мне все ссылки, а не только бесплатные.Это проблема первая.
Проблема вторая заключается в том, что мне нужно эффективно предварительно извлекать несколько отношений фильма, когда я получаю их список в БД.Для этого я использую includes()
следующим образом:
default_scope includes(
:formats,
:critic_ratings => [
:network
],
:covers => [
:network
],
:listings => [
:links, :network
]
)
Это также работает, но несовместимо с предыдущей свободной областью действия.Это означает, что он будет захватывать все атрибуты фильма, а не только бесплатные, и я не знаю, как установить какие-либо ограничения для элемента в сложном выражении include гнезда, подобном этому.Я хотел бы иметь возможность предварительно выбрать только ссылки where('price = ?', 0.00)
.Теперь, как у меня это работает, я беру все списки и ссылки, используя этот default_scope
, а затем запускаю отдельную область .free
, которую я установил для Листингов, в одной из моих частичных отрисовок страницы.Но когда я делаю это, запрос возвращается к базе данных, что, как я полагаю, гораздо медленнее, чем если бы я просто вручную фильтровал предварительно извлеченные результаты в памяти с помощью моих собственных тривиальных проверок.
В суммировании:
Проблема первая: правильно сгруппируйте или настройте мою область видимости так, чтобы Movie.links предоставил мне только бесплатные ссылки, не заставляя меня возвращаться к базе данных (то есть я знаю, что мог сделать Movie.links.free w/ free - это область, определенная для Link, но, насколько я знаю, это вернулось бы к db).Если не существует встроенного решения для Задачи Один, использующего области и группировки, я могу просто внедрить помощника для сортировки в памяти на поздних этапах, чтобы решить эту проблему, хотя в сложных случаях это создаст некоторую головную боль.
Проблема вторая: я хочу, чтобы моя область предварительно извлекала только выбранный набор листингов, ссылок и т. Д. На основе условий, которые я оговариваю.Если мы не можем решить проблему 1, вероятно, нет решения проблемы 2, так как у меня нет возможности узнать, какие ссылки были предварительно выбраны, и мне придется снова сканировать их, чтобы найти бесплатные, если только в Movie.links дает мне только бесплатные (будет ли Movie.where () возвращаться в db?).
Надеюсь, это не слишком запутанно.Спасибо за любую помощь.