【问题标题】:rails 3, will_paginate over existing limited active record resultrails 3,will_paginate 超过现有的有限活动记录结果
【发布时间】:2012-01-02 11:51:13
【问题描述】:

我遇到了一个很大的问题,将分页。

我在模型中定义了一个查询范围:

scope :published_and_valid, joins(...).where(...)

在我的控制器中,有时我只想获得前 20 名。

.limit(20)

现在我希望能够对这 20 个结果(每页 5 个)进行分页

我尝试这样做:

@articles = Article.published_and_valid.limit(20).paginate(:page => params[:page])

这不起作用,因为在我看来,结果是所有文章的分页结果

【问题讨论】:

  • 您安装了哪个版本的 will_paginate? (如有疑问,请查看您的Gemfile.lock)。

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


【解决方案1】:

看起来 will_paginate 对您的关系施加了自己的limit 子句以进行分页。经过一些实验,我能找到的最简单的方法是预先加载结果集并使用 the array extensions 中包含的功能来进行实际的分页。

这是一个简单的例子;请注意,您必须要求will_paginate/array;您可能希望在初始化程序或其他地方执行此操作。请注意,它会对 Array 进行猴子补丁以拥有 paginate 方法。

require 'will_paginate/array'

class ArticlesController < ApplicationController
  def index
    @articles = Article.published.limit(20).all # call `all` to eager load
    @articles = @articles.paginate(:page => params[:page], :per_page => 10)
  end
end

[更新]

另一个选项是根据结果集大小将total_entires 选项传递给 will_paginate。

class ArticlesController < ApplicationController
  def index
    @articles = Article.published.limit(20)
    @articles = @articles.paginate(:page => params[:page], :per_page => 10, :total_entries => @articles.count)
  end
end

你不能传入 20,因为你不能保证会返回完整的 20 个结果;通过传入count属性,可以确保分页正确。

【讨论】:

  • ty Brandon 就像一个魅力,这就是我要寻找的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多