From 5863ceb143584e9198f1237b36f1452e26cf11a4 Mon Sep 17 00:00:00 2001 From: Stephan Leibelt Date: Sat, 23 Jun 2018 20:15:49 +0200 Subject: [PATCH] add support for counting grouped collections (#51) --- lib/pagy/backend.rb | 7 ++++--- test/pagy/backend_test.rb | 15 ++++++++++++++- test/test_helper/backend.rb | 8 ++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/pagy/backend.rb b/lib/pagy/backend.rb index 71b22db9e..8f257037f 100644 --- a/lib/pagy/backend.rb +++ b/lib/pagy/backend.rb @@ -16,9 +16,10 @@ def pagy(collection, vars={}) # Sub-method called only by #pagy: here for easy customization of variables by overriding def pagy_get_vars(collection, vars) - # Return the merged variables to initialize the Pagy object - { count: collection.count(:all), # works with AR, but may not work with other ORMs - page: params[vars[:page_param]||VARS[:page_param]] }.merge!(vars) + count = collection.count(:all) + count = count.count if count.respond_to?(:count) # e.g. AR .group returns an OrderdHash that responds to #count + # return the merged variables to initialize the pagy object + { count: count, page: params[vars[:page_param] || VARS[:page_param]] }.merge!(vars) end # Sub-method called only by #pagy: here for easy customization of record-extraction by overriding diff --git a/test/pagy/backend_test.rb b/test/pagy/backend_test.rb index 94c27aa2d..75922ca9d 100644 --- a/test/pagy/backend_test.rb +++ b/test/pagy/backend_test.rb @@ -4,7 +4,6 @@ describe Pagy::Backend do - let(:backend) { TestController.new } describe "#pagy" do @@ -66,6 +65,20 @@ def test_pagy_get_vars_with_vars assert_equal('X', merged[:link_extra]) end + def test_pagy_get_vars_with_grouped_collection + @collection = GroupedCollection.new((1..1000).to_a) + vars = {page: 2, items: 10, link_extra: 'X'} + merged = backend.send :pagy_get_vars, @collection, vars + assert_includes(merged.keys, :count) + assert_includes(merged.keys, :page) + assert_includes(merged.keys, :items) + assert_includes(merged.keys, :link_extra) + assert_equal(1000, merged[:count]) + assert_equal(2, merged[:page]) + assert_equal(10, merged[:items]) + assert_equal('X', merged[:link_extra]) + end + end describe "#pagy_get_items" do diff --git a/test/test_helper/backend.rb b/test/test_helper/backend.rb index 626312c75..f58268df7 100644 --- a/test/test_helper/backend.rb +++ b/test/test_helper/backend.rb @@ -30,3 +30,11 @@ def count(*_) end end + +class GroupedCollection < TestCollection + + def count(*_) + @collection.map { |value| [value, value + 1] }.to_h + end + +end