使用Kaminari合并Rails查询

时间:2016-12-08 18:45:24

标签: ruby-on-rails ruby ruby-on-rails-5

我的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)这似乎效率很低。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

取决于你是否希望它保留秩序,也就是说。如果在查询期间任务将被洗牌,这有关系吗?如果您需要保留订单,那么您可能需要深入研究SQL:

请参阅question

所以在你的例子中,它就像是:

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本身并不真正支持这一点。

当然,如果您的查询不是必须保留订单。你可以使用这个宝石:

How to have a custom sort order for a union query in Postgres

这为您的ActiveRecord查询添加了联合功能,您可以执行任务.Open.open.page(1).per(5).union(Task.checked.page(1).per(5))等等。然后你可以稍后在Ruby中对自己进行排序。