aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/attribute_methods
diff options
context:
space:
mode:
authorAngelo capilleri <capilleri@yahoo.com>2012-06-08 10:09:28 +0200
committerRafael Mendonça França <rafaelmfranca@gmail.com>2012-06-19 01:54:34 -0300
commitb9ec47da00e7f5e159ff130441585c3b42e41849 (patch)
tree58908be96097647185a2659c588cfe81154f6053 /activerecord/lib/active_record/attribute_methods
parent69f19b292ad4b228f2bc5f89732a8ef3b704fab6 (diff)
downloadrails-b9ec47da00e7f5e159ff130441585c3b42e41849.tar.gz
rails-b9ec47da00e7f5e159ff130441585c3b42e41849.tar.bz2
rails-b9ec47da00e7f5e159ff130441585c3b42e41849.zip
Validates_numericality_of is skipped when changing 0 to to non-empty string
This happens when A has_many many B and A accepts_nested_attributes B that has a numeric colum with initial 0 value. So a.update_attributes({:b_attributes => { :id => b.id, :numeric => 'foo' }}) passes the validation test but, the value of :numeric doesn't change. his commit forces that the update fails with the above conditions. Fixes #6393 Fixes #2331
Diffstat (limited to 'activerecord/lib/active_record/attribute_methods')
-rw-r--r--activerecord/lib/active_record/attribute_methods/dirty.rb20
1 files changed, 15 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/attribute_methods/dirty.rb b/activerecord/lib/active_record/attribute_methods/dirty.rb
index f8a40ad520..032aefd8c0 100644
--- a/activerecord/lib/active_record/attribute_methods/dirty.rb
+++ b/activerecord/lib/active_record/attribute_methods/dirty.rb
@@ -77,11 +77,8 @@ module ActiveRecord
def _field_changed?(attr, old, value)
if column = column_for_attribute(attr)
- if column.number? && column.null && (old.nil? || old == 0) && value.blank?
- # For nullable numeric columns, NULL gets stored in database for blank (i.e. '') values.
- # Hence we don't record it as a change if the value changes from nil to ''.
- # If an old value of 0 is set to '' we want this to get changed to nil as otherwise it'll
- # be typecast back to 0 (''.to_i => 0)
+ if numeric_changes_from_nil_to_empty_string?(column, old, value) ||
+ numeric_changes_from_zero_to_string?(column, old, value)
value = nil
else
value = column.type_cast(value)
@@ -90,6 +87,19 @@ module ActiveRecord
old != value
end
+
+ def numeric_changes_from_nil_to_empty_string?(column, old, value)
+ # For nullable numeric columns, NULL gets stored in database for blank (i.e. '') values.
+ # Hence we don't record it as a change if the value changes from nil to ''.
+ # If an old value of 0 is set to '' we want this to get changed to nil as otherwise it'll
+ # be typecast back to 0 (''.to_i => 0)
+ column.number? && column.null && (old.nil? || old == 0) && value.blank?
+ end
+
+ def numeric_changes_from_zero_to_string?(column, old, value)
+ # For numeric columns with old 0 and value non-empty string
+ column.number? && old == 0 && value != '0' && !value.blank? && !old.nil?
+ end
end
end
end