diff options
author | Rafael França <rafaelmfranca@gmail.com> | 2017-06-26 17:25:18 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-26 17:25:18 -0400 |
commit | 7b841b61f57e0329be01e943b2ed157b0e11f4f8 (patch) | |
tree | bde5cbdf37dee41f1072a0ec0d3703c25dcec10b /activerecord/lib/active_record | |
parent | f3a64adb4e84ae6dfc986472e1552946b95ab930 (diff) | |
parent | c9cf8b8dd4b968e21768f495d6ed0861a6efe08c (diff) | |
download | rails-7b841b61f57e0329be01e943b2ed157b0e11f4f8.tar.gz rails-7b841b61f57e0329be01e943b2ed157b0e11f4f8.tar.bz2 rails-7b841b61f57e0329be01e943b2ed157b0e11f4f8.zip |
Merge pull request #29557 from kamipo/extract_build_scope_and_predicate_builder
Extract `build_scope` and `predicate_builder` in `Reflection`
Diffstat (limited to 'activerecord/lib/active_record')
3 files changed, 21 insertions, 20 deletions
diff --git a/activerecord/lib/active_record/associations/association_scope.rb b/activerecord/lib/active_record/associations/association_scope.rb index 4ce4252224..1744dc785f 100644 --- a/activerecord/lib/active_record/associations/association_scope.rb +++ b/activerecord/lib/active_record/associations/association_scope.rb @@ -142,7 +142,7 @@ module ActiveRecord # Exclude the scope of the association itself, because that # was already merged in the #scope method. reflection.constraints.each do |scope_chain_item| - item = eval_scope(reflection.klass, table, scope_chain_item, owner) + item = eval_scope(reflection, table, scope_chain_item, owner) if scope_chain_item == refl.scope scope.merge! item.except(:where, :includes) @@ -163,9 +163,8 @@ module ActiveRecord scope end - def eval_scope(klass, table, scope, owner) - predicate_builder = PredicateBuilder.new(TableMetadata.new(klass, table)) - ActiveRecord::Relation.create(klass, table, predicate_builder).instance_exec(owner, &scope) + def eval_scope(reflection, table, scope, owner) + reflection.build_scope(table).instance_exec(owner, &scope) end end end diff --git a/activerecord/lib/active_record/associations/join_dependency/join_association.rb b/activerecord/lib/active_record/associations/join_dependency/join_association.rb index 97cfec0302..95f16c622e 100644 --- a/activerecord/lib/active_record/associations/join_dependency/join_association.rb +++ b/activerecord/lib/active_record/associations/join_dependency/join_association.rb @@ -40,15 +40,7 @@ module ActiveRecord constraint = build_constraint(klass, table, key, foreign_table, foreign_key) - predicate_builder = PredicateBuilder.new(TableMetadata.new(klass, table)) - scope_chain_items = reflection.join_scopes(table, predicate_builder) - klass_scope = reflection.klass_join_scope(table, predicate_builder) - - scope_chain_items.concat [klass_scope].compact - - rel = scope_chain_items.inject(scope_chain_items.shift) do |left, right| - left.merge right - end + rel = reflection.join_scope(table) if rel && !rel.arel.constraints.empty? binds += rel.bound_attributes diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb index e8ee8279fd..c6aa2ed720 100644 --- a/activerecord/lib/active_record/reflection.rb +++ b/activerecord/lib/active_record/reflection.rb @@ -185,10 +185,17 @@ module ActiveRecord end deprecate :scope_chain + def join_scope(table) + predicate_builder = predicate_builder(table) + scope_chain_items = join_scopes(table, predicate_builder) + klass_scope = klass_join_scope(table, predicate_builder) + + scope_chain_items.inject(klass_scope || scope_chain_items.shift, &:merge!) + end + def join_scopes(table, predicate_builder) # :nodoc: if scope - [ActiveRecord::Relation.create(klass, table, predicate_builder) - .instance_exec(&scope)] + [build_scope(table, predicate_builder).instance_exec(&scope)] else [] end @@ -200,11 +207,7 @@ module ActiveRecord scope.joins_values = scope.left_outer_joins_values = [].freeze } else - relation = ActiveRecord::Relation.create( - klass, - table, - predicate_builder, - ) + relation = build_scope(table, predicate_builder) klass.send(:build_default_scope, relation) end end @@ -287,12 +290,19 @@ module ActiveRecord JoinKeys.new(join_pk(association_klass), join_fk) end + def build_scope(table, predicate_builder = predicate_builder(table)) + Relation.create(klass, table, predicate_builder) + end + protected def actual_source_reflection # FIXME: this is a horrible name self end private + def predicate_builder(table) + PredicateBuilder.new(TableMetadata.new(klass, table)) + end def join_pk(_) foreign_key |