2016-12-08 3 views
0

У меня есть модель в проекте 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

ответ

0

Зависит, если вы хотите сохранить заказ или нет, иначе. имеет значение, если задачи будут перетасованы во время запроса? Если необходимо сохранить порядок, то вам, вероятно, нужно копаться с 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 позже.