module QueryMethodsExtend::Association

Public Class Methods

check_association_exist(method_name) click to toggle source
# File lib/query_methods_extend/association.rb, line 6
def self.check_association_exist method_name
  if @check_association_exist_flag
    return false
  end

  @check_association_exist_flag = true

  association = self.try(:reflect_on_association, method_name)
  result = false
  if association && association.try(:macro) == :has_many
    options = association.options

    if options[:through]
      @check_association_exist_flag = false
      return self.all.send(options[:through]).send(method_name)
    end

    query = self.select(association.active_record.primary_key)

    if options[:as] && !association.inverse_of && association.klass
      polymorphic_as = association.klass.reflect_on_association(options[:as])
      if polymorphic_as.polymorphic? && association.active_record
        polymorphic_model = polymorphic_as.active_record
        model = association.active_record
        @check_association_exist_flag = false
        return polymorphic_as.active_record
          .where("#{polymorphic_model.table_name}.#{polymorphic_as.foreign_type}".to_sym => model.name)
          .where("#{polymorphic_model.table_name}.#{polymorphic_as.foreign_key}".to_sym => query)
      end
    end

    model = association.options[:class] || association.inverse_of.active_record
    foreign_key = association.options[:foreign_key] || association.inverse_of.foreign_key

    result = model.where("#{model.table_name}.#{foreign_key.to_s}".to_sym => query)

  end

  @check_association_exist_flag = false
  return result
end