我想爲郵件系統創建分頁,其中顯示的第一頁包含最舊的郵件,隨後的頁面顯示較新的郵件。與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
?
我想爲郵件系統創建分頁,其中顯示的第一頁包含最舊的郵件,隨後的頁面顯示較新的郵件。與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
?
是的,但我提出的方法並不完全漂亮。實際上,你必須設定自己的順序:
Message.page(1).per(3).order("created_at DESC").reverse!
這種方法的問題是雙重的:
首先相反!調用將範圍解析爲數組並進行查詢,使用AR範圍削弱kaminari的一些精彩方面。其次,與任何反向分頁一樣,您的偏移量將會移動,這意味着在兩次重複調用之間,您可以準確發送3條新消息,並且您會得到完全相同的數據。這個問題是反向分頁所固有的。
另一種方法是詢問「最後」頁碼和向下增加你的網頁數量對1
就像這樣:'pages = Message.count%3; Message.page(pages - i).per(3).order(「created_at DESC」)'? – Trompa
除了'order(「created_at DESC」)''應該是'order(「created_at ASC」)''如果你打算採用這種方法。 –
一種方法來解決這個問題將是這一個: Reverse pagination with kaminari? 它看起來並不很乾淨也沒有最佳,但它的工作原理:)
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。
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 %>
爲什麼你不簡單地對翻轉數據集進行分頁? 'YourModel.order(「created_at ASC」)。page'? – thomasfedb