diff options
author | Jon Leighton <j@jonathanleighton.com> | 2011-01-24 23:30:11 +0000 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2011-01-30 11:58:08 +0000 |
commit | 88df88095c82cde53501abe2a44f6c1f66c272b4 (patch) | |
tree | 22b2b27bd4c735b23bcdf10da16d14df4f479072 | |
parent | 1da1ac159f9391b9a053a0fb0d426499b9edd5b7 (diff) | |
download | rails-88df88095c82cde53501abe2a44f6c1f66c272b4.tar.gz rails-88df88095c82cde53501abe2a44f6c1f66c272b4.tar.bz2 rails-88df88095c82cde53501abe2a44f6c1f66c272b4.zip |
AssociationCollection#to_ary should definitely dup the target! Also changed #replace which was previously incorrect, but the test passed due to the fact that to_a was not duping.
-rw-r--r-- | activerecord/lib/active_record/associations/association_collection.rb | 6 | ||||
-rw-r--r-- | activerecord/test/cases/associations/has_many_associations_test.rb | 7 |
2 files changed, 10 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/associations/association_collection.rb b/activerecord/lib/active_record/associations/association_collection.rb index 7504773639..f2997b9db3 100644 --- a/activerecord/lib/active_record/associations/association_collection.rb +++ b/activerecord/lib/active_record/associations/association_collection.rb @@ -45,7 +45,7 @@ module ActiveRecord end def to_ary - load_target + load_target.dup end alias_method :to_a, :to_ary @@ -289,13 +289,13 @@ module ActiveRecord # This will perform a diff and delete/add only records that have changed. def replace(other_array) other_array.each { |val| raise_on_type_mismatch(val) } - - load_target + original_target = load_target.dup transaction do delete(@target - other_array) unless concat(other_array - @target) + @target = original_target raise RecordNotSaved, "Failed to replace #{@reflection.name} because one or more of the " "new records could not be saved." end diff --git a/activerecord/test/cases/associations/has_many_associations_test.rb b/activerecord/test/cases/associations/has_many_associations_test.rb index 3bec9c97f4..5904966ee5 100644 --- a/activerecord/test/cases/associations/has_many_associations_test.rb +++ b/activerecord/test/cases/associations/has_many_associations_test.rb @@ -1349,4 +1349,11 @@ class HasManyAssociationsTest < ActiveRecord::TestCase assert_equal reply.id, first.id assert_equal true, first.approved? end + + def test_to_a_should_dup_target + ary = topics(:first).replies.to_a + target = topics(:first).replies.target + + assert_not_equal target.object_id, ary.object_id + end end |