From 1d6a87779c73bc7d9d5f235afadc0df4a36f534f Mon Sep 17 00:00:00 2001 From: joker1007 Date: Tue, 29 Jul 2014 20:16:10 +0900 Subject: Fix type casting to Decimal from Float with ... When I defines large precision column at RDBMS, I assigns float value, raise ArgumentError (precision too large). --- activerecord/lib/active_record/type/decimal.rb | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'activerecord/lib/active_record/type') diff --git a/activerecord/lib/active_record/type/decimal.rb b/activerecord/lib/active_record/type/decimal.rb index ba5d244729..d10778eeb6 100644 --- a/activerecord/lib/active_record/type/decimal.rb +++ b/activerecord/lib/active_record/type/decimal.rb @@ -14,12 +14,25 @@ module ActiveRecord private def cast_value(value) - if value.is_a?(::Numeric) || value.is_a?(::String) + case value + when ::Float + BigDecimal(value, float_precision) + when ::Numeric, ::String BigDecimal(value, precision.to_i) - elsif value.respond_to?(:to_d) - value.to_d else - cast_value(value.to_s) + if value.respond_to?(:to_d) + value.to_d + else + cast_value(value.to_s) + end + end + end + + def float_precision + if precision.to_i > ::Float::DIG + 1 + ::Float::DIG + 1 + else + precision.to_i end end end -- cgit v1.2.3