Ensure Associations#sum returns 0 when no rows are returned. [#295 state:resolved]

Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
This commit is contained in:
Jonathan Viney
2008-06-02 15:00:15 +12:00
committed by Pratik Naik
parent a980eb8c77
commit 4210d85a3f
2 changed files with 5 additions and 4 deletions

View File

@@ -71,7 +71,7 @@ module ActiveRecord
#
# Person.sum('age')
def sum(column_name, options = {})
calculate(:sum, column_name, options) || 0
calculate(:sum, column_name, options)
end
# This calculates aggregate values in the given column. Methods for count, sum, average, minimum, and maximum have been added as shortcuts.
@@ -265,8 +265,8 @@ module ActiveRecord
def type_cast_calculated_value(value, column, operation = nil)
operation = operation.to_s.downcase
case operation
when 'count' then value.to_i
when 'avg' then value && value.to_f
when 'count', 'sum' then value.to_i
when 'avg' then value && value.to_f
else column ? column.type_cast(value) : value
end
end

View File

@@ -99,6 +99,7 @@ class CalculationsTest < ActiveRecord::TestCase
def test_should_return_zero_if_sum_conditions_return_nothing
assert_equal 0, Account.sum(:credit_limit, :conditions => '1 = 2')
assert_equal 0, companies(:rails_core).companies.sum(:id, :conditions => '1 = 2')
end
def test_should_group_by_summed_field_with_conditions
@@ -266,6 +267,6 @@ class CalculationsTest < ActiveRecord::TestCase
end
def test_should_sum_expression
assert_equal "636", Account.sum("2 * credit_limit")
assert_equal 636, Account.sum("2 * credit_limit")
end
end