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

her*_*w78 1 ruby-on-rails will-paginate ruby-on-rails-3

对于paginate我有一个很大的问题.

我在我的模型中将查询定义为范围:

scope :published_and_valid, joins(...).where(...)
Run Code Online (Sandbox Code Playgroud)

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

.limit(20)
Run Code Online (Sandbox Code Playgroud)

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

我试着这样做:

@articles = Article.published_and_valid.limit(20).paginate(:page => params[:page])
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ley 7

看起来will_paginate会对limit你的关系强加自己的子句以进行分页.经过一些实验,我能找到的最简单的方法是对结果集进行急切加载,并使用数组扩展中包含的功能来进行实际的分页.

这是一个简单的例子; 请注意,您必须要求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
Run Code Online (Sandbox Code Playgroud)

[更新]

另一种选择是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
Run Code Online (Sandbox Code Playgroud)

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