mirror of
https://github.com/github/rails.git
synced 2026-04-04 03:00:58 -04:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user