«Комплексная» группировка и индексация в рельсах? - PullRequest
2 голосов
/ 04 апреля 2011

У меня есть проблема, с которой я не могу найти простое решение.

Я хочу добиться следующего:
* У меня есть список задач, у каждого из которых есть владелец и срок выполнения
* Я хочу отобразить список всех задач, сгруппированных по владельцу
* Я хочу отсортировать владельцев по срокам: например, Сначала владелец с наименьшей датой оплаты, затем владелец со вторым наименьшим и т. Д. * Я хочу иметь возможность разбивать результаты на страницы, желательно с will_paginate

Чтобы проиллюстрировать, это будет результат, который я ищу:

Harry
- задание 1, срок выполнения 1
- задание 3, срок выполнения 4
Бен
- задание 2, срок выполнения 2
Carol
- задание 4, срок выполнения 3

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

У этого подхода несколько проблем, imo:
* Я запускаю несколько запросов из представления (owner.tasks.each и т. д.). Я всегда узнал, что выполнение запросов из представления плохо
* Я делаю сортировку, загружая все записи в память (виртуальный атрибут), что может вызвать проблемы при большом наборе записей. * Я понятия не имею, как я могу включить нумерацию страниц, это будет зависеть от количества отображаемых задач

Кажется, я не могу взломать этот орех, поэтому любая помощь или подсказки будут с благодарностью!
Эрвин

1 Ответ

1 голос
/ 04 апреля 2011

Попробуйте этот запрос, вы не предоставили пример данных (в идеале с использованием SQL), чтобы мы могли играть сами:

SELECT
u.id as owner_id, u.name as owner_name, t.id, t.due_date
FROM users u
INNER JOIN tasks m ON u.id = m.owner_id
INNER JOIN tasks t ON u.id = t.owner_id
GROUP BY u.id, u.name, t.id, t.due_date
ORDER BY MIN(m.due_date), t.due_date

Вы должны получить все необходимые данные в правильном порядке, и вы можетеДля разбиения на страницы просто примените LIMIT к нему (или конвертируйте его в AR и отправьте в will_paginate).

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