2011-05-17 16 views
0

在我的問題模型,我有一些範圍搬家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]) 

,對於第一個例子正常工作,但我不知道如何實現在第二個例子

任何提示?

回答

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中處理範圍和關係對象,並且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