diff --git a/activerecord/lib/active_record/calculations.rb b/activerecord/lib/active_record/calculations.rb index c3e7313f6d85aec237201187e2876bfebacf3a8a..490c8f47127bb0579177f5967b6177de5481b02b 100644 --- a/activerecord/lib/active_record/calculations.rb +++ b/activerecord/lib/active_record/calculations.rb @@ -169,7 +169,10 @@ def construct_calculation_sql(operation, column_name, options) #:nodoc: end end - sql = "SELECT #{operation}(#{'DISTINCT ' if options[:distinct]}#{column_name}) AS #{aggregate_alias}" + if options[:distinct] && column_name.to_s !~ /\s*DISTINCT\s+/i + distinct = 'DISTINCT ' + end + sql = "SELECT #{operation}(#{distinct}#{column_name}) AS #{aggregate_alias}" # A (slower) workaround if we're using a backend, like sqlite, that doesn't support COUNT DISTINCT. sql = "SELECT COUNT(*) AS #{aggregate_alias}" if use_workaround diff --git a/activerecord/test/cases/calculations_test.rb b/activerecord/test/cases/calculations_test.rb index 1771065a667c2141887784ab4f7d055bff5383f4..0ed40b469d3a2ff51d07585af20104745b4f975b 100644 --- a/activerecord/test/cases/calculations_test.rb +++ b/activerecord/test/cases/calculations_test.rb @@ -241,6 +241,10 @@ def test_should_count_selected_field_with_include assert_equal 4, Account.count(:distinct => true, :include => :firm, :select => :credit_limit) end + def test_should_count_manual_select_with_include + assert_equal 6, Account.count(:select => "DISTINCT accounts.id", :include => :firm) + end + def test_count_with_column_parameter assert_equal 5, Account.count(:firm_id) end