class ActiveRecord::Associations::JoinDependency
def make_constraints(parent, child, join_type)
def make_constraints(parent, child, join_type) foreign_table = parent.table foreign_klass = parent.base_klass child.join_constraints(foreign_table, foreign_klass, join_type, alias_tracker) do |reflection, remaining_reflection_chain| table, terminated = @joined_tables[remaining_reflection_chain] root = reflection == child.reflection if table && (!root || !terminated) @joined_tables[remaining_reflection_chain] = [table, root] if root next table, true end table_name = @references[reflection.name.to_sym]&.to_s table = alias_tracker.aliased_table_for(reflection.klass.arel_table, table_name) do name = reflection.alias_candidate(parent.table_name) root ? name : "#{name}_join" end @joined_tables[remaining_reflection_chain] ||= [table, root] if join_type == Arel::Nodes::OuterJoin table end.concat child.children.flat_map { |c| make_constraints(child, c, join_type) } end