18

表示される最初のページに最も古いメッセージが含まれ、後続のページに新しいメッセージが表示されるメッセージングシステムのページ付けを作成したいと思います。

たとえば、{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ですか?

4

4 に答える 4

3

Kaminary.paginate_arrayオフセットと制限のあるクエリは生成されません。最適化のため、これは使用しないでください。

代わりにこれを行うことができます:

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

Wherequery_for_messageは、ページネーションのためにレコードを取得するために使用する任意のクエリを表します。たとえば、特定の会話のすべてのメッセージである可能性があります。

ビュー ファイルで@messagesは、逆の順序で表示するだけです。例えば:

<%= render :collection => @messages.reverse, :partial => 'message' %>
<%= paginate @messages %>
于 2014-04-06T17:42:48.960 に答える
2

Github のreverse_kaminariという良いサンプル リポジトリが Github にあります。これらの線に沿った実装を提案しています(ソース)

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に帰属します。彼はまた、アプリを動作するデモとしてホストしました。

于 2013-03-18T10:20:02.440 に答える
1

この問題を解決する 1 つの方法は次のとおり です。 それはあまりきれいでも最適でもないように見えますが、うまくいきます:)

于 2013-03-17T17:22:35.437 に答える
0

はい、しかし、私が思いついた方法は正確にはきれいではありません。事実上、独自の順序を設定する必要があります。

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

このアプローチには 2 つの問題があります。

まずは逆!call はスコープを配列に解決してクエリを実行し、AR スコープを使用してカミナリのいくつかの優れた側面を弱体化します。

2 つ目は、リバース ページネーションと同様に、オフセットが移動することです。つまり、2 回の繰り返し呼び出しの間に、ちょうど 3 つの新しいメッセージが送信され、まったく同じデータが返される可能性があります。この問題は、逆ページ付けに固有のものです。

別のアプローチは、「最後の」ページ番号を調べて、ページ番号を 1 に向かってインクリメントすることです。

于 2012-12-28T22:01:55.403 に答える