Module: DynamicQuery::CombinedQuery

Includes:
Joiner, Validator
Included in:
DynamicQueryInstance
Defined in:
lib/dynamic_query/combined_query.rb

Instance Method Summary collapse

Methods included from Validator

#filter_valid_info

Methods included from Joiner

#join

Instance Method Details

#combine_query(query, relations, opts = {}) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/dynamic_query/combined_query.rb', line 34

def combine_query(query, relations, opts = {})
  conds = conditions(query).first || {}
  models = relations.each_slice(3).map { |sec| sec.first }
  foreign_keys = relations - models
  
  selected_records = filter_conditioned_records(models, foreign_keys, conds)
  selected_records = remove_unlinked_records(selected_records, foreign_keys)
  result = join(selected_records, foreign_keys)
  
  result.delete_if { |row| row.include? nil } unless opts[:accept_null]
  result.map { |row| row.map { |rec| rec.attributes.keep_if { |k, _| k.to_s !~ /id$/ } } } unless opts[:reveal_id]
  
  result
end

#conditions(query, table = nil) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/dynamic_query/combined_query.rb', line 8

def conditions(query, table = nil)
  query ||= {}
  query = query.clone
  query = filter_valid_info(query)
  
  conditions = []
  query.each do |_, ands|
    conditions << ands.map { |_, v| condition_to_pair v }
  end
  
  cond = []
  conditions.each do |condition|
    c = {}
    condition.each do |pair|
      pair.each do |k, v|
        c[k] ||= []
        c[k].concat v
      end
    end
    c.keys.each { |k| c[k] = Hash[ c[k].each_slice(2).to_a ] }
    cond << c
  end 
  cond.map! { |c| c[table.to_s] } if table
  cond
end