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 ed35fbe10..ce27b2ea1 100644 --- a/kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb +++ b/kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb @@ -32,15 +32,17 @@ def total_count(column_name = :all, _options = nil) #:nodoc: c = c.limit(max_pages * limit_value) if max_pages && max_pages.respond_to?(:*) - # .group returns an OrderedHash that responds to #count - c = c.count(column_name) - @total_count = if c.is_a?(Hash) || c.is_a?(ActiveSupport::OrderedHash) - c.count - elsif c.respond_to? :count - c.count(column_name) - else - c - end + # Handle grouping with a subquery + @total_count = if c.group_values.any? + # Only count non-null values of column_name if supplied + c = c.where.not column_name => nil unless column_name.nil? || column_name == :all + + c.connection.select_value(<<-SQL.strip).to_i + SELECT count(*) FROM (#{c.except(:select).select("1").to_sql}) subquery + SQL + else + c.count(column_name) + end end # Turn this Relation to a "without count mode" Relation. 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 68febbacb..5f7d3cece 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 @@ -105,13 +105,13 @@ class ActiveRecordRelationMethodsTest < ActiveSupport::TestCase end test 'calculating STI total_count with GROUP BY clause' do - { - 'Fenton' => Dog, - 'Bob' => Dog, - 'Garfield' => Cat, - 'Bob' => Cat, - 'Caine' => Insect - }.each { |name, type| type.create!(name: name) } + [ + ['Fenton', Dog], + ['Bob', Dog], + ['Garfield', Cat], + ['Bob', Cat], + ['Caine', Insect] + ].each { |name, type| type.create!(name: name) } assert_equal 3, Mammal.group(:name).page(1).total_count end