From b84185264d7cef8a63d07e462afa5c16726b51f4 Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Fri, 4 Oct 2019 15:47:46 +0900 Subject: [PATCH] Merge pull request #37360 from kamipo/deprecate_leaking_scope Deprecate leaking scope in callback block for association relation --- .../lib/active_record/association_relation.rb | 3 +++ .../has_many_associations_test.rb | 24 +++++++++++++++++-- activerecord/test/models/bulb.rb | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/activerecord/lib/active_record/association_relation.rb b/activerecord/lib/active_record/association_relation.rb index 4c538ef2bd..eaaae6a639 100644 --- a/activerecord/lib/active_record/association_relation.rb +++ b/activerecord/lib/active_record/association_relation.rb @@ -16,15 +16,18 @@ def ==(other) end def build(*args, &block) + block = _deprecated_scope_block("new", &block) scoping { @association.build(*args, &block) } end alias new build def create(*args, &block) + block = _deprecated_scope_block("create", &block) scoping { @association.create(*args, &block) } end def create!(*args, &block) + block = _deprecated_scope_block("create!", &block) scoping { @association.create!(*args, &block) } end diff --git a/activerecord/test/cases/associations/has_many_associations_test.rb b/activerecord/test/cases/associations/has_many_associations_test.rb index fe7e5dc559..5f6114d31e 100644 --- a/activerecord/test/cases/associations/has_many_associations_test.rb +++ b/activerecord/test/cases/associations/has_many_associations_test.rb @@ -2499,14 +2499,34 @@ def test_association_with_rewhere_doesnt_set_inverse_instance_key test "first_or_initialize adds the record to the association" do firm = Firm.create! name: "omg" - client = firm.clients_of_firm.first_or_initialize + client = firm.clients_of_firm.where(name: "lol").first_or_initialize do + assert_deprecated do + assert_equal 0, Client.count + end + end assert_equal [client], firm.clients_of_firm end test "first_or_create adds the record to the association" do firm = Firm.create! name: "omg" firm.clients_of_firm.load_target - client = firm.clients_of_firm.first_or_create name: "lol" + client = firm.clients_of_firm.where(name: "lol").first_or_create do + assert_deprecated do + assert_equal 0, Client.count + end + end + assert_equal [client], firm.clients_of_firm + assert_equal [client], firm.reload.clients_of_firm + end + + test "first_or_create! adds the record to the association" do + firm = Firm.create! name: "omg" + firm.clients_of_firm.load_target + client = firm.clients_of_firm.where(name: "lol").first_or_create! do + assert_deprecated do + assert_equal 0, Client.count + end + end assert_equal [client], firm.clients_of_firm assert_equal [client], firm.reload.clients_of_firm end diff --git a/activerecord/test/models/bulb.rb b/activerecord/test/models/bulb.rb index ab92f7025d..5e97772bfe 100644 --- a/activerecord/test/models/bulb.rb +++ b/activerecord/test/models/bulb.rb @@ -9,7 +9,7 @@ class Bulb < ActiveRecord::Base after_initialize :record_scope_after_initialize def record_scope_after_initialize - @scope_after_initialize = self.class.all + @scope_after_initialize = self.class.unscoped.all end after_initialize :record_attributes_after_initialize -- GitLab