Ensure Model.sum and Model.avg typecast appropriately. [#1066 state:resolved]

Model.sum delegates typecasting to the column being summed. If that's not feasible, returns a string.
Model.avg always returns big decimal.
This commit is contained in:
Pratik Naik
2008-10-04 20:03:42 +01:00
parent 1dfebd4f0d
commit 9599948fbc
2 changed files with 10 additions and 6 deletions

View File

@@ -285,11 +285,15 @@ module ActiveRecord
operation = operation.to_s.downcase
case operation
when 'count' then value.to_i
when 'sum' then value =~ /\./ ? value.to_f : value.to_i
when 'avg' then value && value.to_f
else column ? column.type_cast(value) : value
when 'sum' then type_cast_using_column(value || '0', column)
when 'avg' then value && value.to_d
else type_cast_using_column(value, column)
end
end
def type_cast_using_column(value, column)
column ? column.type_cast(value) : value
end
end
end
end

View File

@@ -18,8 +18,8 @@ class CalculationsTest < ActiveRecord::TestCase
def test_should_average_field
value = Account.average(:credit_limit)
assert_kind_of Float, value
assert_in_delta 53.0, value, 0.001
assert_kind_of BigDecimal, value
assert_equal BigDecimal.new('53.0'), value
end
def test_should_return_nil_as_average
@@ -273,7 +273,7 @@ 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
def test_count_with_from_option