From 393e98a85999878d832eaba2da42a8805aff54e8 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 6 Jan 2005 02:36:33 +0000 Subject: [PATCH] Fixed Base#update_attribute to be indifferent to whether a string or symbol is used to describe the name git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@341 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 2 ++ activerecord/lib/active_record/base.rb | 2 +- activerecord/lib/active_record/validations.rb | 2 +- activerecord/test/base_test.rb | 3 +++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index cea70c095a..ddb9d683d8 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Fixed Base#update_attribute to be indifferent to whether a string or symbol is used to describe the name + * Added Base#toggle(attribute) and Base#toggle!(attribute) that makes it easier to flip a switch or flag. Before: topic.update_attribute(:approved, !approved?) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 76b9ea0e36..bd7195a33b 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -828,7 +828,7 @@ module ActiveRecord #:nodoc: # Note: This method is overwritten by the Validation module that'll make sure that updates made with this method # doesn't get subjected to validation checks. Hence, attributes can be updated even if the full object isn't valid. def update_attribute(name, value) - self[name.to_s] = value + self[name] = value save end diff --git a/activerecord/lib/active_record/validations.rb b/activerecord/lib/active_record/validations.rb index 39eb6c013b..1da73d6dc5 100755 --- a/activerecord/lib/active_record/validations.rb +++ b/activerecord/lib/active_record/validations.rb @@ -293,7 +293,7 @@ module ActiveRecord # This is especially useful for boolean flags on existing records. The regular +update_attribute+ method # in Base is replaced with this when the validations module is mixed in, which it is by default. def update_attribute_with_validation_skipping(name, value) - @attributes[name] = value + self[name] = value save(false) end diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb index 07740547cd..ccd9152e60 100755 --- a/activerecord/test/base_test.rb +++ b/activerecord/test/base_test.rb @@ -367,6 +367,9 @@ class BasicsTest < Test::Unit::TestCase assert !Topic.find(1).approved? Topic.find(1).update_attribute("approved", true) assert Topic.find(1).approved? + + Topic.find(1).update_attribute(:approved, false) + assert !Topic.find(1).approved? end def test_mass_assignment_protection