Permalink
Browse files

Dirty: recognize when an integer changes from zero to blank. [#433 st…

…ate:resolved]
  • Loading branch information...
1 parent 9a25315 commit 1415df8f49a19d469b9e2c15785db32eb312c000 @timchater timchater committed with jeremy Jun 17, 2008
Showing with 30 additions and 1 deletion.
  1. +3 −1 activerecord/lib/active_record/dirty.rb
  2. +27 −0 activerecord/test/cases/dirty_test.rb
View
4 activerecord/lib/active_record/dirty.rb
@@ -142,9 +142,11 @@ def update_with_dirty
def field_changed?(attr, old, value)
if column = column_for_attribute(attr)
- if column.type == :integer && column.null && old.nil?
+ if column.type == :integer && column.null && (old.nil? || old == 0)
# For nullable integer 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)
value = nil if value.blank?
else
value = column.type_cast(value)
View
27 activerecord/test/cases/dirty_test.rb
@@ -55,6 +55,33 @@ def test_nullable_integer_not_marked_as_changed_if_new_value_is_blank
end
end
+ def test_zero_to_blank_marked_as_changed
+ pirate = Pirate.new
+ pirate.catchphrase = "Yarrrr, me hearties"
+ pirate.parrot_id = 1
+ pirate.save
+
+ # check the change from 1 to ''
+ pirate = Pirate.find_by_catchphrase("Yarrrr, me hearties")
+ pirate.parrot_id = ''
+ assert pirate.parrot_id_changed?
+ assert_equal([1, nil], pirate.parrot_id_change)
+ pirate.save
+
+ # check the change from nil to 0
+ pirate = Pirate.find_by_catchphrase("Yarrrr, me hearties")
+ pirate.parrot_id = 0
+ assert pirate.parrot_id_changed?
+ assert_equal([nil, 0], pirate.parrot_id_change)
+ pirate.save
+
+ # check the change from 0 to ''
+ pirate = Pirate.find_by_catchphrase("Yarrrr, me hearties")
+ pirate.parrot_id = ''
+ assert pirate.parrot_id_changed?
+ assert_equal([0, nil], pirate.parrot_id_change)
+ end
+
def test_object_should_be_changed_if_any_attribute_is_changed
pirate = Pirate.new
assert !pirate.changed?

0 comments on commit 1415df8

Please sign in to comment.