Module: ActiveRecord

Included in:
Conjoin::ActiveRecord
Defined in:
lib/conjoin/active_record.rb

Overview

github.com/rails/rails/blob/4-1-stable/activerecord/lib/active_record/associations/association_scope.rb#L63 module ActiveRecord

module Associations
  class AssociationScope #:nodoc:
    def add_constraints(scope, owner, assoc_klass, refl, tracker)
      chain = refl.chain
      scope_chain = refl.scope_chain

      tables = construct_tables(chain, assoc_klass, refl, tracker)

      chain.each_with_index do |reflection, i|
        table, foreign_table = tables.shift, tables.first

        if reflection.source_macro == :belongs_to
          if reflection.options[:polymorphic]
            key = reflection.association_primary_key(assoc_klass)
          else
            key = reflection.association_primary_key
          end

          foreign_key = reflection.foreign_key
        else
          key         = reflection.foreign_key
          foreign_key = reflection.active_record_primary_key
        end

        if reflection == chain.last
          bind_val = bind scope, table.table_name, key.to_s, owner[foreign_key], tracker
          scope    = scope.where(table[key].eq(bind_val))

          if reflection.type
            #############################################
            #############################################
            #############################################
            #############################################
            #############################################
            #############################################
            # .gsub(/\w+::/, '')
            # is a fix for polymorphic associations like
            # VendorWizard::VendorGroup so it can work
            # with the _type VendorGroup instead of
            # VendorWizard::VendorGroup
            #############################################
            #############################################
            #############################################
            #############################################
            #############################################
            value    = owner.class.base_class.name.gsub(/\w+::/, '')
            #############################################
            bind_val = bind scope, table.table_name, reflection.type.to_s, value, tracker
            scope    = scope.where(table[reflection.type].eq(bind_val))
          end
        else
          constraint = table[key].eq(foreign_table[foreign_key])

          if reflection.type
            value    = chain[i + 1].klass.base_class.name
            bind_val = bind scope, table.table_name, reflection.type.to_s, value, tracker
            scope    = scope.where(table[reflection.type].eq(bind_val))
          end

          scope = scope.joins(join(foreign_table, constraint))
        end

        is_first_chain = i == 0
        klass = is_first_chain ? assoc_klass : reflection.klass

        # Exclude the scope of the association itself, because that
        # was already merged in the #scope method.
        scope_chain[i].each do |scope_chain_item|
          item  = eval_scope(klass, scope_chain_item, owner)

          if scope_chain_item == refl.scope
            scope.merge! item.except(:where, :includes, :bind)
          end

          if is_first_chain
            scope.includes! item.includes_values
          end

          scope.where_values += item.where_values
          scope.order_values |= item.order_values
        end
      end

      scope
    end
  end
end

end ACTIVERECORD 4.0.3

Defined Under Namespace

Modules: Associations