diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 7e29352de5b0e0dc2c0d8f95aec52266570c43b3..ee9bc2238468e7e0f66b0b1c4dc4e6a68f1d6dce 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added Base#attributes that returns a hash of all the attributes with their names as keys and clones of their objects as values #433 [atyp.de] + * Fixed that foreign keys named the same as the association would cause stack overflow #437 [Eric Anderson] * Fixed default scope of acts_as_list from "1" to "1 = 1", so it'll work in PostgreSQL (among other places) #427 [Alexey] diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 8be5c7302a968bd4aeb7cbb9170bc762cbc0ca2c..1770026bb4b08e9bb0e13cedcc72f8e4835a53f6 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -909,6 +909,18 @@ def attributes=(attributes) assign_multiparameter_attributes(multi_parameter_attributes) end + # Returns a hash of all the attributes with their names as keys and clones of their objects as values. + def attributes + self.attribute_names.inject({}) do |attributes, name| + begin + attributes[name] = read_attribute(name).clone + rescue TypeError + attributes[name] = read_attribute(name) + end + attributes + end + end + # Returns true if the specified +attribute+ has been set by the user or by a database load and is neither # nil nor empty? (the latter only applies to objects that responds to empty?, most notably Strings). def attribute_present?(attribute) diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb index 119be8d868d52d4d87ed495d81cfbf77a965f9ac..da9daa639886bf76e0474248455667cc37ed745b 100755 --- a/activerecord/test/base_test.rb +++ b/activerecord/test/base_test.rb @@ -2,6 +2,7 @@ require 'fixtures/topic' require 'fixtures/reply' require 'fixtures/company' +require 'fixtures/project' require 'fixtures/default' require 'fixtures/auto_id' require 'fixtures/column_name' @@ -26,7 +27,7 @@ class TightDescendent < TightPerson class Booleantest < ActiveRecord::Base; end class BasicsTest < Test::Unit::TestCase - fixtures :topics, :companies + fixtures :topics, :companies, :projects def test_set_attributes topic = Topic.find(1) @@ -100,6 +101,10 @@ def test_update_array_content topic.content << "five" assert_equal(%w( one two three four five ), topic.content) end + + def test_attributes_hash + assert_equal @projects["action_controller"].to_hash, @action_controller.attributes + end def test_create topic = Topic.new