From dc662e1d05006b180ac342306deb40a6df84d6d4 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Guillermo=20=C3=81lvarez?= Date: Thu, 12 Feb 2009 19:46:31 +0100 Subject: [PATCH] Add _reset method to reset changed methods --- activerecord/lib/active_record/dirty.rb | 12 ++++++++++-- activerecord/test/cases/dirty_test.rb | 11 +++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/activerecord/lib/active_record/dirty.rb b/activerecord/lib/active_record/dirty.rb index 4a2510a..99c4cc5 100644 --- a/activerecord/lib/active_record/dirty.rb +++ b/activerecord/lib/active_record/dirty.rb @@ -13,6 +13,9 @@ module ActiveRecord # person.name_change # => ['uncle bob', 'Bob'] # person.name = 'Bill' # person.name_change # => ['uncle bob', 'Bill'] + # person.name_reset # => 'uncle bob' + # person.changed? # => false + # person.name_changed? # => false # # Save the changes: # person.save @@ -34,7 +37,7 @@ module ActiveRecord # person.name << 'by' # person.name_change # => ['uncle bob', 'uncle bobby'] module Dirty - DIRTY_SUFFIXES = ['_changed?', '_change', '_will_change!', '_was'] + DIRTY_SUFFIXES = ['_changed?', '_change', '_will_change!', '_was', '_reset'] def self.included(base) base.attribute_method_suffix *DIRTY_SUFFIXES @@ -116,7 +119,12 @@ module ActiveRecord def attribute_was(attr) attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr) end - + + # Handle *_reset for +method_missing+. + def attribute_reset(attr) + attribute_changed?(attr) ? self[attr] = changed_attributes[attr] : __send__(attr) + end + # Handle *_will_change! for +method_missing+. def attribute_will_change!(attr) changed_attributes[attr] = clone_attribute_value(:read_attribute, attr) diff --git a/activerecord/test/cases/dirty_test.rb b/activerecord/test/cases/dirty_test.rb index 5f5707b..6a25dc2 100644 --- a/activerecord/test/cases/dirty_test.rb +++ b/activerecord/test/cases/dirty_test.rb @@ -61,6 +61,17 @@ class DirtyTest < ActiveRecord::TestCase assert_nil parrot.title_was assert_equal parrot.name_change, parrot.title_change end + + def test_attribute_reset + pirate = Pirate.find_by_catchphrase("Yar.") + pirate.catchphrase = 'Wadus Wadus !' + + pirate.catchphrase_reset + assert_equal "Yar.", pirate.catchphrase + assert_equal Hash.new, pirate.changes + assert !pirate.catchphrase_changed? + end + def test_nullable_number_not_marked_as_changed_if_new_value_is_blank pirate = Pirate.new -- 1.6.0.2