尝试做一个简单的Model.all.page(1)
但是每当调用 .page 时,它都会创建一个 SQL COUNT 调用。 (我的实际代码比上面更复杂,但为了便于阅读而进行了简化。)有没有办法阻止 .page 调用 SQL 计数?我正在处理数百万种产品,此调用使页面刷新需要额外 2 秒才能加载。我已经有了自己的即时自定义计数,因此我不需要此 .page 计数。
编辑:默认不使用 .all。不好的例子抱歉。
这是一个非常简单的示例,基本上是我的代码简而言之:
Product.limit(1).page(1)
使用我的真实代码 SQL 生成:(1495.3ms) SELECT COUNT(*) FROM 'products' LEFT OUTER JOIN...
我在不需要计算的产品表上有连接,因此我有自己想要使用的计数方法,不需要 .page 来生成它自己的计数。
最佳答案
当您调用 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)
关于mysql - 模型上的 Rails .page 调用也调用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713016/