aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/type
diff options
context:
space:
mode:
authorDaniel Fox <romaimperator@gmail.com>2014-12-23 00:19:14 -0600
committerDaniel Fox <romaimperator@gmail.com>2014-12-23 00:19:14 -0600
commit2859341c383daac74608f978d8e8fad2229042a3 (patch)
treee738d92c864195844e57878d52c419145ed078a4 /activerecord/lib/active_record/type
parent38e9f5b1d80018cb32b918f7ddd0ec677e79dfd2 (diff)
downloadrails-2859341c383daac74608f978d8e8fad2229042a3.tar.gz
rails-2859341c383daac74608f978d8e8fad2229042a3.tar.bz2
rails-2859341c383daac74608f978d8e8fad2229042a3.zip
Fixing numeric attrs when set to same negative value
This bug occurs when an attribute of an ActiveRecord model is an ActiveRecord::Type::Integer type or a ActiveRecord::Type::Decimal type (or any other type that includes the ActiveRecord::Type::Numeric module. When the value of the attribute is negative and is set to the same negative value, it is marked as changed. Take the following example of a Person model with the integer attribute age: class Person < ActiveRecord::Base # age :integer(4) end The following will produce the error: person = Person.new(age: -1) person.age = -1 person.changes => { "age" => [-1, -1] } person.age_changed? => true The problematic line is here: module ActiveRecord module Type module Numeric ... def non_numeric_string?(value) # 'wibble'.to_i will give zero, we want to make sure # that we aren't marking int zero to string zero as # changed. value.to_s !~ /\A\d+\.?\d*\z/ end end end end The regex match doesn't accept numbers with a leading '-'.
Diffstat (limited to 'activerecord/lib/active_record/type')
-rw-r--r--activerecord/lib/active_record/type/numeric.rb2
1 files changed, 1 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/type/numeric.rb b/activerecord/lib/active_record/type/numeric.rb
index fa43266504..674f996f38 100644
--- a/activerecord/lib/active_record/type/numeric.rb
+++ b/activerecord/lib/active_record/type/numeric.rb
@@ -29,7 +29,7 @@ module ActiveRecord
# 'wibble'.to_i will give zero, we want to make sure
# that we aren't marking int zero to string zero as
# changed.
- value.to_s !~ /\A\d+\.?\d*\z/
+ value.to_s !~ /\A-?\d+\.?\d*\z/
end
end
end