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