Rails: выполнение с ограниченным числом включений и сложная группировка с областями действия - PullRequest
1 голос
/ 20 февраля 2012

Вот моя основная иерархия моделей:

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?).

Надеюсь, это не слишком запутанно.Спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...