From 09ee78696b87840775faf933660928d34f439587 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Thu, 19 Jun 2025 00:40:13 +0300 Subject: [PATCH] Allow to specify cursor column in get_page_items --- .../concerns/pagination_methods.rb | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/controllers/concerns/pagination_methods.rb b/app/controllers/concerns/pagination_methods.rb index 79ab10bfb..682086a27 100644 --- a/app/controllers/concerns/pagination_methods.rb +++ b/app/controllers/concerns/pagination_methods.rb @@ -5,26 +5,30 @@ module PaginationMethods ## # limit selected items to one page, get ids of first item before/after the page - def get_page_items(items, includes: [], limit: 20) + def get_page_items(items, includes: [], limit: 20, cursor_column: :id) param! :before, Integer, :min => 1 param! :after, Integer, :min => 1 - id_column = "#{items.table_name}.id" + qualified_cursor_column = "#{items.table_name}.#{cursor_column}" page_items = if params[:before] - items.where("#{id_column} < ?", params[:before]).order(:id => :desc) + items.where("#{qualified_cursor_column} < ?", params[:before]).order(cursor_column => :desc) elsif params[:after] - items.where("#{id_column} > ?", params[:after]).order(:id => :asc) + items.where("#{qualified_cursor_column} > ?", params[:after]).order(cursor_column => :asc) else - items.order(:id => :desc) + items.order(cursor_column => :desc) end page_items = page_items.limit(limit) page_items = page_items.includes(includes) page_items = page_items.sort.reverse - newer_items_id = page_items.first.id if page_items.count.positive? && items.exists?(["#{id_column} > ?", page_items.first.id]) - older_items_id = page_items.last.id if page_items.count.positive? && items.exists?(["#{id_column} < ?", page_items.last.id]) + newer_items_cursor = page_items.first&.send cursor_column + older_items_cursor = page_items.last&.send cursor_column - [page_items, newer_items_id, older_items_id] + [ + page_items, + (newer_items_cursor if page_items.count.positive? && items.exists?(["#{qualified_cursor_column} > ?", newer_items_cursor])), + (older_items_cursor if page_items.count.positive? && items.exists?(["#{qualified_cursor_column} < ?", older_items_cursor])) + ] end end -- 2.39.5