将will_paginate移动到模型

时间:2011-05-17 20:03:50

标签: ruby-on-rails ruby-on-rails-3 will-paginate

在我的问题模型上,我有一些范围

scope :recent, order("created_at DESC")  
scope :approved, where("status = ?", "approved")       
scope :answered, approved.recent.where("answers_count > ?", 0)

在我的问题控制器上,我正在使用范围

检索问题

示例1:

@questions = Question.approved.recent

示例2:

@questions = User.find(session[:user_id]).topics.map { |t| t.questions.approved.recent }.flatten.uniq

我正在尝试将will_paginate放在我的模型上以使控制器更容易,但第二个例子非常棘手,因为它使用映射来根据偏好检索问题。

我试图在我的模型上添加它

  def self.pagination(page = 1)
      self.paginate(:page => page, :per_page => 5)
    end

然后在我的控制器上我

@questions = Question.approved.recent.pagination.(params[:page])

这适用于第一个例子,但我不知道如何在第二个例子上实现它

任何提示?

1 个答案:

答案 0 :(得分:3)

这看起来像Rails 3.请务必使用will_paginate gem的~> 3.0.pre2版本。

您可以在范围链的末尾使用paginate方法。例如,您的“示例1”将是:

@questions = Question.approved.recent.paginate(:page => params[:page], :per_page => 20)

我看到你创建了一个自定义方法(pagination)来包装这个模式,但是现在最好保持这种语法的原始形式,特别是因为你在Rails 3中处理范围和Relation对象并且will_paginate尚未得到适当的支持(但它即将到来)。

在你的“示例2”中,您似乎只需要从每个主题中获取最近几个最近的问题,并且您不会在这里执行完整的分页(例如,转到第2页和前进)。您不必在此处使用paginate方法;你可以简单地使用ActiveRecord的limit

current_user = User.find(session[:user_id])
@questions = current_user.topics.map { |topic|
  topic.questions.approved.recent.limit(5).to_a
}.flatten.uniq