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)
这不起作用,因为我认为结果是所有文章的分页结果
看起来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属性,您可以确保分页正确.
| 归档时间: |
|
| 查看次数: |
1949 次 |
| 最近记录: |