Module: ActiveRecord

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

Overview

https://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