模型上的Rails .page调用也调用count

时间:2014-02-11 21:07:19

标签: mysql ruby-on-rails pagination will-paginate

尝试做一个简单的Model.all.page(1)
但是每当调用.page时,它都会创建一个SQL COUNT调用。 (我的实际代码比上面的更复杂,但为了便于阅读而简化了。)有没有办法阻止.page调用SQL计数?我正在处理数以百万计的产品,而这些调用使得页面刷新需要额外的2秒才能加载。我已经拥有自己的自定义计数,这是即时的所以我不需要这个.page count。

编辑:默认不使用.all。不好的例子抱歉。

下面是一个非常简单的例子,简单来说就是我的代码: Product.limit(1).page(1)

使用我的实际代码SQL生成:(1495.3ms) SELECT COUNT(*) FROM 'products' LEFT OUTER JOIN...

我加入了产品表,我不需要计算,因此我有自己的计数方法,我想使用它,并且不需要.page来产生它自己的计数。

2 个答案:

答案 0 :(得分:2)

当您致电Model.all.page(1)时,您将返回一个数组而不是ActiveRecord关系。

尝试只调用Model.page(1),你应该得到你想要的......如果你想要的是:

Model.page(1)

# results in SELECT "models".* FROM "models" LIMIT 30 OFFSET 0

修改 因此问题最终出现在will_paginate gem中,因为它在查询上调用count来知道条目的总数,因此它可以获得准确的页数。但是,will_paginate会为paginate方法提供一个选项,允许您传入自定义total_entries计数,如果您有一个庞大的表并且不关心获取精确的页数,这将非常有用与查询匹配的每条记录。

你可以像这样传递选项:

Model.paginate(:page => params[:page], :per_page => 30, :total_entries => 100)

答案 1 :(得分:1)

您担心执行COUNT查询,但是您通过执行Model.all从数据库中选择所有记录?你现在开玩笑吗? 您还需要提供代码才能获得帮助。我们无法理解你的想法,我们无法弥补你可能拥有的代码。特别是当你说"我的实际代码比上面更复杂时#34;。不要试图简化问题或隐藏您认为无关的代码。

您的代码是什么样的?您的日志是什么样的,特别是查询时间和总页面时间(呈现和ActiveRecord拆分)。您需要提供更多信息。