From 69dc5ee20851f5034f922f3bae42fe2ec8de9920 Mon Sep 17 00:00:00 2001 From: Visnu Pitiyanuvath Date: Thu, 11 Jun 2009 16:49:49 -0700 Subject: [PATCH] has_one :through builds a new object when owner is a new record --- activerecord/lib/active_record/associations.rb | 6 +++++- .../associations/has_one_through_association.rb | 10 ++++++++-- .../has_one_through_associations_test.rb | 10 ++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 8491a26..6702cba 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -1238,7 +1238,11 @@ module ActiveRecord if association_proxy_class == HasOneThroughAssociation association.create_through_record(new_value) - self.send(reflection.name, new_value) + if new_record? + association_instance_set(reflection.name, new_value.nil? ? nil : association) + else + self.send(reflection.name, new_value) + end else association.replace(new_value) association_instance_set(reflection.name, new_value.nil? ? nil : association) diff --git a/activerecord/lib/active_record/associations/has_one_through_association.rb b/activerecord/lib/active_record/associations/has_one_through_association.rb index d93c8e7..d8bcf76 100644 --- a/activerecord/lib/active_record/associations/has_one_through_association.rb +++ b/activerecord/lib/active_record/associations/has_one_through_association.rb @@ -9,8 +9,14 @@ module ActiveRecord if current_object new_value ? current_object.update_attributes(construct_join_attributes(new_value)) : current_object.destroy - else - @owner.send(@reflection.through_reflection.name, klass.send(:create, construct_join_attributes(new_value))) if new_value + elsif new_value + if @owner.new_record? + self.target = new_value + through_association = @owner.send(:association_instance_get, @reflection.through_reflection.name) + through_association.build(construct_join_attributes(new_value)) + else + @owner.send(@reflection.through_reflection.name, klass.create(construct_join_attributes(new_value))) + end end end diff --git a/activerecord/test/cases/associations/has_one_through_associations_test.rb b/activerecord/test/cases/associations/has_one_through_associations_test.rb index ab6e6d2..9aef3eb 100644 --- a/activerecord/test/cases/associations/has_one_through_associations_test.rb +++ b/activerecord/test/cases/associations/has_one_through_associations_test.rb @@ -28,6 +28,16 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase assert_not_nil new_member.current_membership assert_not_nil new_member.club end + + def test_creating_association_builds_through_record_for_new + new_member = Member.new(:name => "Jane") + new_member.club = clubs(:moustache_club) + assert new_member.current_membership + assert_equal clubs(:moustache_club), new_member.current_membership.club + assert_equal clubs(:moustache_club), new_member.club + assert new_member.save + assert_equal clubs(:moustache_club), new_member.club + end def test_replace_target_record new_club = Club.create(:name => "Marx Bros") -- 1.6.2.4