Use .before
, .after
, or .cursor
in ActiveRecord queries to paginate data. A default limit is always applied, or you can override by including .limit
in your request.
For example, say we have an app with User and Post models.
# app/models/user.rb
class User < ActiveRecord::Base
has_many :posts
end
# app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
end
We can retrieve posts starting with the most recent
Post.before # get the first page of most recent posts with the default limit
Post.before.limit(10) # get the 10 most recent posts
Post.before(999).limit(10) # get the 10 most recent posts that were created before the post with id=999
Post.where(user: User.first).before(999) # get the 10 most recent posts meeting a condition
User.first.posts.before # get the most recent posts belong to a user
Likewise, we can results starting from the oldest records
Post.after # get the first page of oldest posts with the default limit
Post.after.limit(10) # get the 10 oldest posts
Post.after(999).limit(10) # get the 10 oldest posts that are newer than the post with id=999
Post.where(user: User.first).after(999) # get the 10 oldest posts meeting a condition
User.first.posts.after # get the oldest posts belong to a user
By default, all results are returned in ascending order.
To customize, set a config option, class option or per-query option
This gem makes no assumptions about how you want to return pagination metadata in your responses. Arrays and results provide the cursor information you need.
result = Post.before(999)
result.length
=> 20
result.cursor_before
=> 990 # the minimum id included in the result
result.cursor_after
=> 998 # the maximum id included in the result
TODO
- option for sorting results
- cursor methods on array
- global default for limits
- per-model setting for limits