diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 3aeb9fa182..4011dd4f84 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,8 @@ +* Allow constructors (`build_association` and `create_association`) on + `has_one :through` associations. + + *Santiago Perez Perret* + ## Rails 6.1.0.rc1 (November 02, 2020) ## * Add `connected_to_many` API. diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb index c57ac159f1..e1b207778d 100644 --- a/activerecord/lib/active_record/reflection.rb +++ b/activerecord/lib/active_record/reflection.rb @@ -690,11 +690,6 @@ module ActiveRecord Associations::HasOneAssociation end end - - private - def calculate_constructable(macro, options) - !options[:through] - end end class BelongsToReflection < AssociationReflection # :nodoc: 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 69b4872519..c12945ce25 100644 --- a/activerecord/test/cases/associations/has_one_through_associations_test.rb +++ b/activerecord/test/cases/associations/has_one_through_associations_test.rb @@ -49,6 +49,13 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase assert_not_nil new_member.club end + def test_association_create_constructor_creates_through_record + new_member = Member.create(name: "Chris") + new_member.create_club + assert_not_nil new_member.current_membership + assert_not_nil new_member.club + end + def test_creating_association_builds_through_record new_member = Member.create(name: "Chris") new_club = new_member.association(:club).build @@ -61,6 +68,18 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase assert_predicate new_member.current_membership, :persisted? end + def test_association_build_constructor_builds_through_record + new_member = Member.create(name: "Chris") + new_club = new_member.build_club + assert new_member.current_membership + assert_equal new_club, new_member.club + assert_predicate new_club, :new_record? + assert_predicate new_member.current_membership, :new_record? + assert new_member.save + assert_predicate new_club, :persisted? + assert_predicate new_member.current_membership, :persisted? + end + def test_creating_association_builds_through_record_for_new new_member = Member.new(name: "Jane") new_member.club = clubs(:moustache_club)