CursorPager
A small and easy-to-use library that aims to make it easy to build Rails APIs with cursor-based pagination (aka keyset pagination).
It aims to support the JSON API Cursor Pagination and Relay's GraphQL Cursor Connection specs.
Stable ordering is essential for cursor-based pagination. The gem will automatically add additional sorting by primary key if the relation passed into the page isn't already ordered by the primary key or a datetime column.
Installation
CursorPager is compatible with ActiveRecord 6.0 and 5.2 on Ruby 2.6 and later.
Add this line to your application's Gemfile:
gem "cursor_pager"And then execute:
$ bundle install
Or install it yourself as:
$ gem install cursor_pager
Usage
To fetch the first ten users:
page = CursorPager::Page.new(User.all, first: 10)
page.recordsTo get information about the page or generate a cursor
page.previous_page? # Tells you if there is a previous page
page.next_page? # Tells you if there is a next page
page.cursor_for(page.records.last) # Generates a cursor for a specific item
page.first_cursor # Generates a cursor for the first item
page.last_cursor # Generates a cursor for the last itemTo fetch the first then usres after a certain cursor
page = CursorPager::Page.new(User.all, first: 10, after: "MTA=")
page.recordsTo paginate backwards
page = CursorPager::Page.new(User.all, last: 10, before: "NTA=")
page.recordsConfiguration
Encoder
By default cursors are base64 encoded primary keys of the records. If you wish to change that because you want to add encryption or something similiar, you can provide your own encoder class.
class CustomEncoder
def encode(data)
# Your encoding logic
end
def decode(data)
# Your decoding logic
end
end
CursorPager.configure do |config|
config.encoder = CustomEncoder
endDefault & Maximum Page Size
The default & maximum page sizes are configured as nil (unlimited) by default.
You can however set your own values.
CursorPager.configure do |config|
config.default_page_size = 25
config.maximum_page_size = 100
endNot (yet) supported
- Ordering by SQL alias or function
- Ordering by multiple columns in different directions
Contributing
Bug reports and pull requests are welcome on GitHub. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
License
The gem is available as open source under the terms of the MIT License.