在我的问题模型上,我有一些范围
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])
这适用于第一个例子,但我不知道如何在第二个例子上实现它
任何提示?
答案 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