2012-12-06 130 views
15

我想爲郵件系統創建分頁,其中顯示的第一頁包含最舊的郵件,隨後的頁面顯示較新的郵件。與kaminari反向分頁

例如,如果爲{a,b,c,d,e,f,g,h,i}用3每頁正常分頁是:

{a,b,c}, {d,e,f}, {g,h,i} 

然後反向分頁將是:

{g,h,i}, {d,e,f}, {a,b,c} 

我打算預先設置的頁面,因此結果是相同的作爲正常分頁,只能從最後一頁開始。

這可能與kaminari

+0

爲什麼你不簡單地對翻轉數據集進行分頁? 'YourModel.order(「created_at ASC」)。page'? – thomasfedb

回答

0

是的,但我提出的方法並不完全漂亮。實際上,你必須設定自己的順序:

Message.page(1).per(3).order("created_at DESC").reverse! 

這種方法的問題是雙重的:

首先相反!調用將範圍解析爲數組並進行查詢,使用AR範圍削弱kaminari的一些精彩方面。其次,與任何反向分頁一樣,您的偏移量將會移動,這意味着在兩次重複調用之間,您可以準確發送3條新消息,並且您會得到完全相同的數據。這個問題是反向分頁所固有的。

另一種方法是詢問「最後」頁碼和向下增加你的網頁數量對1

+0

就像這樣:'pages = Message.count%3; Message.page(pages - i).per(3).order(「created_at DESC」)'? – Trompa

+0

除了'order(「created_at DESC」)''應該是'order(「created_at ASC」)''如果你打算採用這種方法。 –

2

Github上有一個很好的示例回購在github上調用reverse_kaminari。它建議沿這些方向執行(Source)

class CitiesController < ApplicationController 

    def index 
    @cities = prepare_cities City.order('created_at DESC') 
    end 

    private 

    def prepare_cities(scope) 
    @per_page = City.default_per_page 
    total_count = scope.count 
    rest_count = total_count > @per_page ? (total_count % @per_page) : 0 
    @num_pages = total_count > @per_page ? (total_count/@per_page) : 1 

    if params[:page] 
     offset = params[:page].sub(/-.*/, '').to_i 
     current_page = @num_pages - (offset - 1)/@per_page 
     scope.page(current_page).per(@per_page).padding(rest_count) 
    else 
     scope.page(1).per(@per_page + rest_count) 
    end 
    end 

end 

所有積分均爲Andrew Djoga。他還主持了該應用程序a working demo

1

Kaminary.paginate_array不會產生具有偏移量和限制的查詢。出於優化原因,你不應該使用這個。

相反,你可以這樣做:

@messages = query_for_message.order('created_at DESC').page(params[:page]).per(3) 

query_for_message代表您使用檢索記錄分頁任何查詢。例如,它可以是特定對話的所有消息。

現在在視圖文件中,您只需要按相反的順序顯示@messages。例如:

<%= render :collection => @messages.reverse, :partial => 'message' %> 
<%= paginate @messages %>