will_paginate与named_scopes

时间:2010-05-07 22:45:29

标签: ruby-on-rails named-scope will-paginate

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

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

class User < ActiveRecord::Base

    named_scope :scope, lambda { etc }

end

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

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

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

我的named_scope定义如下:

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

我称之为:

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

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

答案 2 :(得分:2)

有点奇怪的解决方案,但是

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

作品?

答案 3 :(得分:1)

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

编辑:

您的named_scope是否恰好包含:limit子句?我刚开始遇到类似的问题。我有一个模型Response,其属性为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)技巧来解决这个问题。