diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index faa9ad3ca61b0..71601e35ef3c1 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* belongs_to assignment creates a new proxy rather than modifying its target in-place. #8412 [mmangino@elevatedrails.com] + * Fix column type detection while loading fixtures. Closes #7987 [roderickvd] * Document deep eager includes. #6267 [Josh Susser, Dan Manges] diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 48bc5ac624a68..4c5a781527af1 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -916,7 +916,7 @@ def association_accessor_methods(reflection, association_proxy_class) define_method("#{reflection.name}=") do |new_value| association = instance_variable_get("@#{reflection.name}") - if association.nil? + if association.nil? || association.target != new_value association = association_proxy_class.new(self, reflection) end @@ -926,10 +926,7 @@ def association_accessor_methods(reflection, association_proxy_class) instance_variable_set("@#{reflection.name}", association) else instance_variable_set("@#{reflection.name}", nil) - return nil end - - association end define_method("set_#{reflection.name}_target") do |target| diff --git a/activerecord/test/associations_test.rb b/activerecord/test/associations_test.rb index f1b02cfda5b2c..c2d4db8d1b224 100755 --- a/activerecord/test/associations_test.rb +++ b/activerecord/test/associations_test.rb @@ -1007,7 +1007,20 @@ def test_natural_assignment citibank.firm = apple assert_equal apple.id, citibank.firm_id end - + + def test_no_unexpected_aliasing + first_firm = companies(:first_firm) + another_firm = companies(:another_firm) + + citibank = Account.create("credit_limit" => 10) + citibank.firm = first_firm + original_proxy = citibank.firm + citibank.firm = another_firm + + assert_equal first_firm.object_id, original_proxy.object_id + assert_equal another_firm.object_id, citibank.firm.object_id + end + def test_creating_the_belonging_object citibank = Account.create("credit_limit" => 10) apple = citibank.create_firm("name" => "Apple")