module SQB::Joins

Public Instance Methods

join(table_name, foreign_key, options = {}) click to toggle source

Add a join

@param table_name [String, Symbol] @param foreign_key [String, Symbol] @option options [Hash] :where @option options [Array] :select @return [Query]

# File lib/sqb/joins.rb, line 11
def join(table_name, foreign_key, options = {})
  @joins ||= []
  @joins_name_mapping ||= {}

  if options[:name]
    join_name = options[:name]
  else
    @joins_name_mapping[table_name] ||= 0
    join_name= "#{table_name}_#{@joins_name_mapping[table_name]}"
    @joins_name_mapping[table_name] += 1
  end

  @joins << [].tap do |query|
    query << "INNER JOIN"
    query << escape_and_join(@options[:database_name], table_name)
    query << "AS"
    query << escape(join_name)
    query << "ON"
    query << escape_and_join(@table_name, 'id')
    query << "="
    query << escape_and_join(join_name, foreign_key)
  end.join(' ')

  if options[:where]
    join_where = options[:where].each_with_object({}) do |(column, value), hash|
      hash[{join_name => column}] = value
    end
    where(join_where)
  end

  if columns = options[:columns]
    for field in columns
      column({join_name => field}, :as => "#{join_name}_#{field}")
    end
  end

  if g = options[:group_by]
    group_by(join_name => g.is_a?(Symbol) ? g : :id)
  end

  self
end