1. tsuwatch

    Posted

    tsuwatch
Changes in title
+カーソルでページネーションする activerecord-cursor 作った
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,50 @@
+# はじめに
+カーソルでページネーションするという要件があり、いい感じのGemを探したが存在しなかったので自作した
+
+# 既存のGem
+
+- https://github.com/barkbox/cursor
+- https://github.com/Kukunin/cursor_pagination
+
+があった。 cursorはkeyがidにしか対応していなかったので使えなかった。cursor_paginationは実は実装後に発見したのだが、5年間メンテされてないっぽいのと、カーソルを生成するのにクエリを発行しているので、まぁ作ってよかったんではないだろうか
+cursor_paginationは自分のよりも機能が豊富なので、検討してみても良いと思う
+
+# activerecord-cursor
+
+[tsuwatch/activerecord-cursor](https://github.com/tsuwatch/activerecord-cursor)
+
+## 使い方
+
+```ruby
+Post.cursor(key: :created_at)
+=> [#<Post id: 1, published: false, created_at: "2018-12-30 19:38:27", updated_at: "2018-12-30 19:38:27">]
+Post.cursor(key: :created_at, start: Post.next_cursor)
+=> [#<Post id: 2, published: false, created_at: "2018-12-30 19:38:28", updated_at: "2018-12-30 19:38:28">]
+```
+
+### オプション
+
+- key
+ - ソートするカラムを指定(デフォルトはid)
+- reverse
+ - ソート順が昇順か降順かを指定(デフォルトは昇順)
+- size
+ - 1ページあたりの取得件数(デフォルトは1件)
+- start
+ - カーソルを指定。指定したカーソル以降のレコードを取得
+- stop
+ - カーソルを指定。指定したカーソルより前のレコードを取得
+
+### カーソルについて
+ページネーションを実現するため、前後ページのカーソルを取得できる
+
+```ruby
+Post.next_cursor # 次のページ用カーソル
+Post.prev_cursor # 前のページ用カーソル
+```
+
+取得できる値は、内部的にレコードを取得するために必要な値(`Hash`)を`to_yaml`し、`Base64.urlsafe_encode`したものになっていて、クエリストリングとして受け渡しできる
+
+# さいごに
+今後は、configファイルの生成やヘルパーなど気が向いたら実装していきます
+ぜひ採用の検討をいただければと思います