QA@IT

AutoPagerizeのようなものでのid重複対策

2832 PV

AutoPagerize や twitter のような自動で続きを読み込んで表示する無限スクロールなどと呼ばれるものがありますが、単純にkaminarilink_to_next_page のリンクを自動で読み込んで継ぎ足すと、最初のページを表示してから次のページを読み込むまでの間に追加があった場合、最初のページの最後のエントリと次のページの最初のエントリが同じ id になってしまうことになるのですが、重複を避けるにはどう実装するのが良いのでしょうか?

動作イメージとしては、例えば

  • Aさんが最初のページを表示: 内容 id=100..91
  • 他の誰かが追加: (最初のページの範囲が id=101..92 に変わる)
  • 単純に次のページを継ぎ足し: 内容 id=91..82

となって id=91 が重複してしまうのを避けたいという話です。

回答

ページ末尾のコンテンツの id や更新日時を使って、「この id 以前の 20 件」や「この更新日時以前の 20 件」を表すリンクを作成するのが定石でしょうか。

# in controller
@tweets = @tweets.order("id DESC").where("id < ?", params(:before)).limit(20)
link_to("次の 20 件", tweets_path(before: @tweets.last.id)) #=> /tweets?before=1234

kaminari でこういうことができるかは調べていません。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。