rails 3,will_paginate现有的有限活动记录结果

时间:2011-11-20 19:28:14

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

我对paginate有一个很大的问题。

我的模型中有一个定义为范围的查询:

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

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

.limit(20)

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

我尝试这样做:

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

这不起作用,因为我的视图中的结果是所有文章的分页结果

1 个答案:

答案 0 :(得分:7)

看起来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属性,您可以确保分页正确。