mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Allow ho:through#build when the owner is a new record [#1749 state:resolved]
Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
This commit is contained in:
parent
0472839d68
commit
a0f69722be
2 changed files with 19 additions and 3 deletions
|
@ -18,9 +18,15 @@ module ActiveRecord
|
||||||
current_object = @owner.send(@reflection.through_reflection.name)
|
current_object = @owner.send(@reflection.through_reflection.name)
|
||||||
|
|
||||||
if current_object
|
if current_object
|
||||||
new_value ? current_object.update_attributes(construct_join_attributes(new_value)) : current_object.destroy
|
new_value ? current_object.update_attributes(construct_join_attributes(new_value)) : current_object.destroy
|
||||||
else
|
elsif new_value
|
||||||
@owner.send(@reflection.through_reflection.name, klass.send(:create, construct_join_attributes(new_value))) if 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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,16 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
||||||
assert_not_nil new_member.current_membership
|
assert_not_nil new_member.current_membership
|
||||||
assert_not_nil new_member.club
|
assert_not_nil new_member.club
|
||||||
end
|
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
|
def test_replace_target_record
|
||||||
new_club = Club.create(:name => "Marx Bros")
|
new_club = Club.create(:name => "Marx Bros")
|
||||||
|
|
Loading…
Reference in a new issue