From 56b4fdb52bd327d42aec9ee3dcea01298aafe945 Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Sat, 6 Apr 2019 11:37:34 +0900 Subject: Association loading isn't to be affected by null relation scoping Follow up of #35868. Closes #19349. --- activerecord/lib/active_record/relation.rb | 8 ++++++-- activerecord/lib/active_record/scoping/named.rb | 2 +- .../test/cases/scoping/relation_scoping_test.rb | 24 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) (limited to 'activerecord') diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb index c1ef98c063..c1cdad9c87 100644 --- a/activerecord/lib/active_record/relation.rb +++ b/activerecord/lib/active_record/relation.rb @@ -689,7 +689,7 @@ module ActiveRecord end def empty_scope? # :nodoc: - @values == klass.unscoped.values + !null_relation? && @values == klass.unscoped.values end def has_limit_or_offset? # :nodoc: @@ -721,6 +721,10 @@ module ActiveRecord @loaded = true end + def null_relation? # :nodoc: + is_a?(NullRelation) + end + private def already_in_scope? @delegate_to_klass && begin @@ -770,7 +774,7 @@ module ActiveRecord @records = if eager_loading? apply_join_dependency do |relation, join_dependency| - if ActiveRecord::NullRelation === relation + if relation.null_relation? [] else relation = join_dependency.apply_column_aliases(relation) diff --git a/activerecord/lib/active_record/scoping/named.rb b/activerecord/lib/active_record/scoping/named.rb index 681a5c6250..cd9801b7a0 100644 --- a/activerecord/lib/active_record/scoping/named.rb +++ b/activerecord/lib/active_record/scoping/named.rb @@ -58,7 +58,7 @@ module ActiveRecord end def default_extensions # :nodoc: - if scope = current_scope || build_default_scope + if scope = scope_for_association || build_default_scope scope.extensions else [] diff --git a/activerecord/test/cases/scoping/relation_scoping_test.rb b/activerecord/test/cases/scoping/relation_scoping_test.rb index 8ab0782bbf..50b514d464 100644 --- a/activerecord/test/cases/scoping/relation_scoping_test.rb +++ b/activerecord/test/cases/scoping/relation_scoping_test.rb @@ -421,6 +421,18 @@ class HasManyScopingTest < ActiveRecord::TestCase end end + def test_none_scoping + Comment.none.scoping do + assert_equal 2, @welcome.comments.count + assert_equal "a comment...", @welcome.comments.what_are_you + end + + Comment.where("1=1").scoping do + assert_equal 2, @welcome.comments.count + assert_equal "a comment...", @welcome.comments.what_are_you + end + end + def test_should_maintain_default_scope_on_associations magician = BadReference.find(1) assert_equal [magician], people(:michael).bad_references @@ -461,4 +473,16 @@ class HasAndBelongsToManyScopingTest < ActiveRecord::TestCase assert_equal "a category...", @welcome.categories.what_are_you end end + + def test_none_scoping + Category.none.scoping do + assert_equal 2, @welcome.categories.count + assert_equal "a category...", @welcome.categories.what_are_you + end + + Category.where("1=1").scoping do + assert_equal 2, @welcome.categories.count + assert_equal "a category...", @welcome.categories.what_are_you + end + end end -- cgit v1.2.3