will_paginate与named_scopes

我正在使用will_paginate进行分页,到目前为止一直运行良好,除了这一件事。

例如,如果我尝试对范围进行分页

class User  params[:page], :per_page => 10}) 

这将告诉我paginate是一个未定义的方法。 我宁愿不必仅为此范围使用第二种解决方案,我能在这做些什么吗?

Lowgain,klew的版本应该开箱即用。 在你的版本中你应该写:

 User.scope.paginate :page => params[:page], :per_page => 10 

我更喜欢另一种分页方式。 它允许使控制器更加干净,并在模型级别封装分页,例如:

 class Property < ActiveRecord::Base named_scope :all_properties, lambda {{ :order => "name asc" }} def self.admin_properties(page = 1) self.all_properties.paginate(:page => page, :per_page => Settings.admin.per_page) end end 

在控制器中非常清晰的代码:

 class Admin::PropertiesController < Admin::AdminController def index @properties = Property.admin_properties(params[:page]) end end 

ps: Settings.admin.per_page - 这是Searchlogic设置。

我有一个像这样定义的named_scope

  named_scope :look_for, lambda { |search| bla;bla;bla } 

我称之为:

  Person.look_for(params[:search]).paginate :page => params[:page] 

它有效。 也许你的范围需要一些参数?

一种奇怪的解决方案,但是

 User.scope.find(:all).paginate :page => params[:page], :per_page => 10 

作品?

Lowgain,听起来不像你,但只是为了确保 – 你实际上并没有使用名为scope的named_scope进行测试吗? 因为范围是现有方法,并且使用它作为范围名称会导致错误(以及无限循环)。

编辑:

您的named_scope是否恰好包含:limit子句? 我刚开始遇到类似的问题。 我有一个模型Response,其属于belongs_to User,其命名范围如下:

 named_scope :top, lambda { |limit| { :limit => limit, :order => 'total_score DESC' }} 

我在控制台中看到的结果如下:

 ?> u = User.find 1 ?> u.responses.length => 9 ?> u.responses.paginate(:page => 1, :per_page => 5).length => 5 ?> u.responses.top(3).length => 3 ?> u.responses.top(3).paginate(:page => 1, :per_page => 5).length => 5 

哎呀! 我的前3个分页怎么能产生超过3行? 根据你的例子,我尝试了你的find(:all)技巧并得到了类似的结果:

 ?> u.responses.top(3).find(:all).paginate(:page => 1, :per_page => 5).length => 3 

这看起来像是named_scope中的一个错误,因为我可以将will_paginate从图片中删除并发生类似的混乱:

 ?> u.responses.top(3).length => 3 ?> u.responses.top(3).size => 9 <-- .size produces wrong answer ?> r = u.responses.top(3) ?> r.size => 3 <-- correct when result assigned to var 

到目前为止,这似乎只在我使用MySQL时发生。 我想我在StackOverflow上读了另一篇文章,其中有人在使用带有AR结果和MySQL的.size时遇到了类似的问题,解决方案是总是在他们的AR结果上使用.length。 我已经尝试修改will_paginate以使用.length替换.size的所有实例,但是它不是那么简单,但我怀疑这个或类似的问题在某种程度上影响了will_paginate。

目前,我正在使用你的find(:all)技巧来解决这个问题。

    Interesting Posts