В общем суть такая:
Есть таблицы apps, users, download_requests, installs
Т.е. есть приложения, юзер может подать запрос на скачивание приложения (user has_many download_requests).
После подтверждения, создается install , в котором хранится user и app (install belongs_to user , install belongs_to app).
app has_many installs
user has_many installs
user has_many download_requests
---
Теперь что мне требуется.
Вывести все запросы на скачивание плюс для каждого запроса максимальное количество инсталлов у юзера по какому-либо из приложений.
Мне нужно сделать это одним запросом, использую актив рекорд это реализовал, но выходит очень медленный запрос.
Конкретно проблема в том, что нужно к выборке DownloadRequests.all для кажого добавить грубо говоря поле max_installs_count_for_any_app.
Что-то уже голову сломал =)
Буду рад предложениям.
Если так описывать проблему, тут тоже все голову сломают.
Хотя бы скиньте связи всех этих моделей.
В чем проблема конкретно ? Вывести все запросы вы можете, дума? DownloadRequest.all
Количество инсталлов на юзера тоже можете? (Непонятно, как оно у вас устроено)
Если без SQL, просто map, select (действия над массивом) - так можете решить задачу? И проблема только в составлении оптимального запроса?
app has_many installs
user has_many installs
user has_many download_requests
Мне нужно сделать это одним запросом, использую актив рекорд это реализовал, но выходит очень медленный запрос.
Конкретно проблема в том, что нужно к выборке DownloadRequests.all для кажого добавить грубо говоря поле max_installs_count_for_any_app.
Так понятней? Извиняюсь, просто запарился за день.
Хорошее решение - использовать counter_cache. Добавление такого поля - это хорошо, а не плохо. Зря вам такой вариант не нравится :) вот источник: railscasts.com/episodes/23-counter-cache-column
Конечно, можно составить запрос, что бы mysql на ходу считал количество каждой ассоциации. Но по смыслу, это немногим лучше сортировки уже средствами ruby
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.