我对paginate有一个很大的问题。
我的模型中有一个定义为范围的查询:
scope :published_and_valid, joins(...).where(...)
在我的控制器中,我有时只想拥有前20名。
.limit(20)
现在我希望能够对这20个结果进行分页(每页5个)
我尝试这样做:
@articles = Article.published_and_valid.limit(20).paginate(:page => params[:page])
这不起作用,因为我的视图中的结果是所有文章的分页结果
答案 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
属性,您可以确保分页正确。