mysql - 模型上的 Rails .page 调用也调用计数

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

尝试做一个简单的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/

相关文章:

php - 无法创建表

WHERE 中的 SQL SHA1

MySQL:在 GROUP_CONCAT 中用 0 替换 null

javascript - 使用 AJAX 通过 Ruby on Rails 验证优惠券后获取数据

php - 使用 fgetcsv 解析未转义的双引号

ruby-on-rails - 在 RSpec 中,mock 和 double 之间有什么区别?

ruby-on-rails - 保留搜索表单数据 Ruby On Rails

android - 将长文本分成页面,以便 viewpager 有时显示空白

sql-server - T-sql : how to perform optimised Paging?

python - 如何在 bs4 中使用以下分页抓取网站?