From b067bf788454106de761ad53af460be9fde48abd Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 11 Jan 2005 00:45:26 +0000 Subject: 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] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@386 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 2 ++ activerecord/lib/active_record/base.rb | 12 ++++++++++++ activerecord/test/base_test.rb | 7 ++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 7e29352de5..ee9bc22384 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 8be5c7302a..1770026bb4 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -909,6 +909,18 @@ module ActiveRecord #:nodoc: 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 119be8d868..da9daa6398 100755 --- a/activerecord/test/base_test.rb +++ b/activerecord/test/base_test.rb @@ -2,6 +2,7 @@ require 'abstract_unit' 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 @@ end 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 @@ class BasicsTest < Test::Unit::TestCase 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 -- cgit v1.2.3