method

join_constraints

Importance_0
Ruby on Rails latest stable (v7.1.3.2) - 0 notes - Class: JoinAssociation
join_constraints(foreign_table, foreign_klass, join_type, alias_tracker) public

No documentation

This method has no description. You can help the Ruby on Rails community by adding new notes.

Hide source
# File activerecord/lib/active_record/associations/join_dependency/join_association.rb, line 24
        def join_constraints(foreign_table, foreign_klass, join_type, alias_tracker)
          joins = []
          chain = []

          reflection.chain.each do |reflection|
            table, terminated = yield reflection
            @table ||= table

            if terminated
              foreign_table, foreign_klass = table, reflection.klass
              break
            end

            chain << [reflection, table]
          end

          # The chain starts with the target table, but we want to end with it here (makes
          # more sense in this context), so we reverse
          chain.reverse_each do |reflection, table|
            klass = reflection.klass

            scope = reflection.join_scope(table, foreign_table, foreign_klass)

            unless scope.references_values.empty?
              associations = scope.eager_load_values | scope.includes_values

              unless associations.empty?
                scope.joins! scope.construct_join_dependency(associations, Arel::Nodes::OuterJoin)
              end
            end

            arel = scope.arel(alias_tracker.aliases)
            nodes = arel.constraints.first

            if nodes.is_a?(Arel::Nodes::And)
              others = nodes.children.extract! do |node|
                !Arel.fetch_attribute(node) { |attr| attr.relation.name == table.name }
              end
            end

            joins << join_type.new(table, Arel::Nodes::On.new(nodes))

            if others && !others.empty?
              joins.concat arel.join_sources
              append_constraints(joins.last, others)
            end

            # The current table in this iteration becomes the foreign table in the next
            foreign_table, foreign_klass = table, klass
          end

          joins
        end
Register or log in to add new notes.