diff --git a/kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb b/kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb index 2973c97..41337e9 100644 --- a/kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb +++ b/kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb @@ -29,6 +29,9 @@ module Kaminari c = except(:offset, :limit, :order) # Remove includes only if they are irrelevant c = c.except(:includes) unless references_eager_loaded_tables? + + c = c.limit(max_pages * limit_value) if max_pages && max_pages.respond_to?(:*) + # Handle grouping with a subquery @total_count = if c.group_values.any? c.model.from(c.except(:select).select("1")).count diff --git a/kaminari-core/test/helpers/action_view_extension_test.rb b/kaminari-core/test/helpers/action_view_extension_test.rb index a99dc75..232726f 100644 --- a/kaminari-core/test/helpers/action_view_extension_test.rb +++ b/kaminari-core/test/helpers/action_view_extension_test.rb @@ -274,7 +274,7 @@ if defined?(::Rails::Railtie) && defined?(::ActionView) User.max_pages 4 users = User.page(4).per(10) - assert_equal 'Displaying users 31 - 40 of 50 in total', view.page_entries_info(users) + assert_equal 'Displaying users 31 - 40 of 40 in total', view.page_entries_info(users) ensure User.max_pages nil end @@ -344,9 +344,8 @@ if defined?(::Rails::Railtie) && defined?(::ActionView) end test 'the last page with default entry name' do - User.max_pages 4 - users = User.page(4).per(10) - assert_equal 'Displaying Benutzer 31 - 40 of 50 in total', view.page_entries_info(users, entry_name: 'Benutzer') + users = User.page(5).per(10) + assert_equal 'Displaying Benutzer 41 - 50 of 50 in total', view.page_entries_info(users, entry_name: 'Benutzer') end end end @@ -393,9 +392,8 @@ if defined?(::Rails::Railtie) && defined?(::ActionView) end test 'the last page with default entry name' do - User.max_pages 4 - users = User.page(4).per(10) - assert_equal 'Displaying utilisateurs 31 - 40 of 50 in total', view.page_entries_info(users, entry_name: 'utilisateur') + users = User.page(5).per(10) + assert_equal 'Displaying utilisateurs 41 - 50 of 50 in total', view.page_entries_info(users, entry_name: 'utilisateur') end end end diff --git a/kaminari-core/test/models/active_record/active_record_relation_methods_test.rb b/kaminari-core/test/models/active_record/active_record_relation_methods_test.rb index 9c41a6d..6b82cb7 100644 --- a/kaminari-core/test/models/active_record/active_record_relation_methods_test.rb +++ b/kaminari-core/test/models/active_record/active_record_relation_methods_test.rb @@ -99,6 +99,33 @@ if defined? ActiveRecord test 'calculating total_count with GROUP BY ... HAVING clause' do assert_equal 2, Authorship.group(:user_id).having("COUNT(book_id) >= 3").page(1).total_count end + + test 'total_count with max_pages does not add LIMIT' do + begin + subscriber = ActiveSupport::Notifications.subscribe 'sql.active_record' do |_, __, ___, ____, payload| + assert_not_match /LIMIT/, payload[:sql] + end + + assert_equal 7, User.page.total_count + ensure + ActiveSupport::Notifications.unsubscribe subscriber + end + end + + test 'total_count with max_pages adds "LIMIT (max_pages * per_page)" to the count query' do + begin + subscriber = ActiveSupport::Notifications.subscribe 'sql.active_record' do |_, __, ___, ____, payload| + assert_match /LIMIT/, payload[:sql] + end + + User.max_pages 10 + + assert_equal 7, User.page.total_count + ensure + User.max_pages nil + ActiveSupport::Notifications.unsubscribe subscriber + end + end end end end