16

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

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

class User < ActiveRecord::Base

    named_scope :scope, lambda { etc }

end

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

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

4

4 回答 4

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

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

于 2010-05-09T08:38:06.847 回答
2

我有一个named_scope这样的定义:

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

我称之为:

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

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

于 2010-05-07T23:09:28.840 回答
2

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

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

作品?

于 2010-05-07T23:58:20.960 回答
1

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

编辑:

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

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 上阅读了另一篇文章,其中有人在使用 .size 与 AR 结果和 MySQL 时遇到了类似的问题,解决方案是始终在他们的 AR 结果上使用 .length。我曾尝试修改 will_paginate 以用 .length 替换所有 .size 实例,但可惜并不是那么简单,但我怀疑这个或类似的问题会以某种方式影响 will_paginate。

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

于 2010-05-15T15:58:25.853 回答