Module: SQB::Joins

Included in:
Select
Defined in:
lib/sqb/joins.rb

Instance Method Summary collapse

Instance Method Details

#join(table_name, foreign_key, options = {}) ⇒ Query

Add a join

Parameters:

  • table_name (String, Symbol)
  • foreign_key (String, Symbol)
  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :where (Hash)
  • :select (Array)

Returns:



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 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