У меня есть модель в проекте Rails под названием Task. Задача также использует помощник перечисления ActiveRecord, чтобы иметь 4 состояния, которые являются «открытыми, проверенными, отправленными и закрытыми». Я также использую Kaminari для разбивки на страницы. В любом случае, я могу создать Rails один запрос для получения первых 5 задач в каждой из этих областей? Прямо сейчас я должен позвонить Task.open.page(1).per(5)
Task.checked.page(1).per(5)
Task.sent.page(1).per(5)
Task.closed.page(1).per(5)
который кажется очень неэффективным. Какие-либо предложения?Запросы Merge Rails с использованием Kaminari
ответ
Зависит, если вы хотите сохранить заказ или нет, иначе. имеет значение, если задачи будут перетасованы во время запроса? Если необходимо сохранить порядок, то вам, вероятно, нужно копаться с SQL:
См How to have a custom sort order for a union query in Postgres
Таким образом, в вашем примере, это было бы как:
select *
from (
SELECT 'opened' AS name, *
FROM tasks
WHERE tasks.status = opened LIMIT 5 OFFSET 0
UNION
SELECT 'checked' AS name, *
FROM tasks
WHERE tasks.status = checked LIMIT 5 OFFSET 0
UNION
SELECT 'sent' AS name, *
FROM tasks
WHERE tasks.status = sent LIMIT 5 OFFSET 0
) t
order by
CASE
WHEN name='opened' THEN 1
WHEN name='checked' THEN 2
WHEN name='sent' THEN 3
ELSE 4
END;
Теперь, как вы может быть, это может быть больше проблем, чем того стоит. Насколько мне известно, ActiveRecord на самом деле не поддерживает это.
Конечно, если ваши запросы не обязательно должны быть сохранены в заказе. Вы можете просто использовать этот драгоценный камень:
https://github.com/brianhempel/active_record_union
который добавляет функциональность накидной на ваши вопросы ActiveRecord, которые вы можете сделать Task.open.page (1) .per (5) .union (Task.checked.page (1) .per (5)) и т. Д. Тогда вы можете просто сортировать себя в Ruby позже.