Skip to content
  • Ryuta Kamizono's avatar
    e93f416a
    Fix unscoping association scope on joins not to raise an error · e93f416a
    Ryuta Kamizono authored
    #29589 changed merging scope order to allow to unscope default scopes on
    association scope (#29611), but that caused a regression #38811 that
    accidentally allow join constraint which is required.
    
    ```
    % bin/test test/cases/associations/has_many_associations_test.rb -n test_unscopes_the_default_scope_of_associated_model_when_used_with_include
    Run options: -n test_unscopes_the_default_scope_of_associated_model_when_used_with_include --seed 32978
    
    # Running:
    
    E
    
    Error:
    HasManyAssociationsTest#test_unscopes_the_default_scope_of_associated_model_when_used_with_include:
    NoMethodError: undefined method `children' for nil:NilClass
        ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:39:in `block in join_constraints'
        ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `reverse_each'
        ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `with_index'
        ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `join_constraints'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:171:in `make_constraints'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `block in walk'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `each'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `flat_map'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `walk'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:90:in `block in join_constraints'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `each'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `flat_map'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `join_constraints'
        ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1226:in `build_join_query'
        ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1211:in `build_joins'
        ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1091:in `build_arel'
        ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1063:in `arel'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:419:in `block in limited_ids_for'
        ~/rails/activerecord/lib/active_record/relation.rb:867:in `skip_query_cache_if_necessary'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:419:in `limited_ids_for'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:398:in `apply_join_dependency'
        ~/rails/activerecord/lib/active_record/relation.rb:839:in `block in exec_queries'
        ~/rails/activerecord/lib/active_record/relation.rb:867:in `skip_query_cache_if_necessary'
        ~/rails/activerecord/lib/active_record/relation.rb:834:in `exec_queries'
        ~/rails/activerecord/lib/active_record/relation.rb:639:in `load'
        ~/rails/activerecord/lib/active_record/relation.rb:250:in `records'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:508:in `find_take'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:98:in `take'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:458:in `find_one'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:442:in `find_with_ids'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:69:in `find'
        ~/rails/activerecord/test/cases/associations/has_many_associations_test.rb:2689:in `block in <class:HasManyAssociationsTest>'
    
    bin/test test/cases/associations/has_many_associations_test.rb:2683
    ```
    
    Required join constraint should not be allowed to unscoping.
    
    Fixes #38811.
    e93f416a
    Fix unscoping association scope on joins not to raise an error
    Ryuta Kamizono authored
    #29589 changed merging scope order to allow to unscope default scopes on
    association scope (#29611), but that caused a regression #38811 that
    accidentally allow join constraint which is required.
    
    ```
    % bin/test test/cases/associations/has_many_associations_test.rb -n test_unscopes_the_default_scope_of_associated_model_when_used_with_include
    Run options: -n test_unscopes_the_default_scope_of_associated_model_when_used_with_include --seed 32978
    
    # Running:
    
    E
    
    Error:
    HasManyAssociationsTest#test_unscopes_the_default_scope_of_associated_model_when_used_with_include:
    NoMethodError: undefined method `children' for nil:NilClass
        ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:39:in `block in join_constraints'
        ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `reverse_each'
        ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `with_index'
        ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `join_constraints'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:171:in `make_constraints'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `block in walk'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `each'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `flat_map'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `walk'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:90:in `block in join_constraints'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `each'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `flat_map'
        ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `join_constraints'
        ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1226:in `build_join_query'
        ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1211:in `build_joins'
        ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1091:in `build_arel'
        ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1063:in `arel'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:419:in `block in limited_ids_for'
        ~/rails/activerecord/lib/active_record/relation.rb:867:in `skip_query_cache_if_necessary'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:419:in `limited_ids_for'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:398:in `apply_join_dependency'
        ~/rails/activerecord/lib/active_record/relation.rb:839:in `block in exec_queries'
        ~/rails/activerecord/lib/active_record/relation.rb:867:in `skip_query_cache_if_necessary'
        ~/rails/activerecord/lib/active_record/relation.rb:834:in `exec_queries'
        ~/rails/activerecord/lib/active_record/relation.rb:639:in `load'
        ~/rails/activerecord/lib/active_record/relation.rb:250:in `records'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:508:in `find_take'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:98:in `take'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:458:in `find_one'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:442:in `find_with_ids'
        ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:69:in `find'
        ~/rails/activerecord/test/cases/associations/has_many_associations_test.rb:2689:in `block in <class:HasManyAssociationsTest>'
    
    bin/test test/cases/associations/has_many_associations_test.rb:2683
    ```
    
    Required join constraint should not be allowed to unscoping.
    
    Fixes #38811.
Loading