在轨道上的红宝石中无限滚动分页,每页一个查询?

时间:2011-08-12 16:26:30

标签: ruby-on-rails ruby will-paginate kaminari

典型的rails pagination gem的问题在于它会执行2个查询:一个用于您正在访问的页面,另一个用于总计数。当你不关心有多少页面时(例如在无限滚动中),第二个查询是不必要的(只需在第一个查询中将LIMIT子句加1,你知道是否有更多页面。)

在没有第二个查询的情况下,是否存在可以进行分页的宝石?在我的WHERE子句中对大型数据集应用非索引过滤器并且索引所有我的各种过滤器是不可接受的时,第二个查询是昂贵的,因为我需要快速插入。

谢谢!

2 个答案:

答案 0 :(得分:1)

想出来。使用will_paginate gem时,您可以为AR:Base.paginate提供自己的total_entries选项。这使得第二个查询无法运行。

这适用于您只关心最近条目的足够大的数据集。

如果你真的希望点击列表的末尾,这不一定是可以接受的,因为如果列表大小可以被per_page整除,那么你将在上一个查询中查询一个空集。无尽的卷轴,这很好。使用手动“加载更多”按钮,当没有更多项目要加载时,您将在最后显示“加载更多”。

答案 1 :(得分:0)

正如您所确定的那样,标准方法是在您需要N时获取N + 1条记录,如果您在响应中获得的记录超过N条,则至少可以显示一页额外的结果。< / p>

您想要进行明确COUNT(*)调用的唯一原因是,您需要具体了解需要获取的记录数量。在某些引擎上,这可能需要花费大量时间进行计算,因此最好避免使用,特别是如果永远不会直接使用该值。

由于这很简单,你真的不需要一个插件来做它。像will_paginate这样的插件更关心可用的页数,因此它可以进行计数操作。