From 49d7536fa761e2ff147375ed85146feaca59ff65 Mon Sep 17 00:00:00 2001 From: Jon Birke Date: Wed, 4 Dec 2024 19:06:21 -0500 Subject: [PATCH] add previous attribute --- gem/lib/pagy/keyset.rb | 19 +++++++++++++++++++ gem/lib/pagy/keyset/active_record.rb | 3 +++ 2 files changed, 22 insertions(+) diff --git a/gem/lib/pagy/keyset.rb b/gem/lib/pagy/keyset.rb index d4df6d8ff..c86a1af9c 100644 --- a/gem/lib/pagy/keyset.rb +++ b/gem/lib/pagy/keyset.rb @@ -60,6 +60,25 @@ def next end end + # Return the previous page + def previous + records + + @previous ||= begin + hash = keyset_attributes_from(@records.first) + json = @vars[:jsonify_keyset_attributes]&.(hash) || hash.to_json + B64.urlsafe_encode(json) + end + + return @previous if previous? + + nil + end + + def previous? + filter_oldest.limit(1).exists? + end + # Fetch the array of records for the current page def records @records ||= begin diff --git a/gem/lib/pagy/keyset/active_record.rb b/gem/lib/pagy/keyset/active_record.rb index 0d0155b57..813266cb8 100644 --- a/gem/lib/pagy/keyset/active_record.rb +++ b/gem/lib/pagy/keyset/active_record.rb @@ -20,6 +20,9 @@ def extract_keyset # Filter the newest records def filter_newest = @set.where(filter_newest_query, **@latest) + # Filter the oldest records + def filter_oldest = @set.reverse_order.where(filter_newest_query, **@previous) + # Append the missing keyset keys if the set is restricted by select def apply_select @set.select(*@keyset.keys)