Class: Airmodel::Query

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/airmodel/query.rb

Instance Method Summary collapse

Constructor Details

#initialize(querying_class) ⇒ Query

Returns a new instance of Query.



5
6
7
# File 'lib/airmodel/query.rb', line 5

def initialize(querying_class)
  @querying_class = querying_class
end

Instance Method Details

#allObject



90
91
92
# File 'lib/airmodel/query.rb', line 90

def all
  to_a
end

#by_formula(formula) ⇒ Object



23
24
25
26
# File 'lib/airmodel/query.rb', line 23

def by_formula(formula)
  params[:formulas].push formula
  self
end

#each(&block) ⇒ Object



94
95
96
# File 'lib/airmodel/query.rb', line 94

def each(&block)
  to_a.each(&block)
end

#find_by(filters) ⇒ Object



110
111
112
113
114
# File 'lib/airmodel/query.rb', line 110

def find_by(filters)
  params[:limit] = 1
  params[:where_clauses] = filters
  first
end

#get_offsetObject

return saved airtable offset for this query



71
72
73
# File 'lib/airmodel/query.rb', line 71

def get_offset
  @offset
end

#inspectObject



102
103
104
# File 'lib/airmodel/query.rb', line 102

def inspect
  to_a.inspect
end

#lastObject



106
107
108
# File 'lib/airmodel/query.rb', line 106

def last
  to_a.last
end

#limit(lim) ⇒ Object



49
50
51
52
# File 'lib/airmodel/query.rb', line 49

def limit(lim)
  params[:limit] = lim ? lim.to_i : nil
  self
end

#map(&block) ⇒ Object



98
99
100
# File 'lib/airmodel/query.rb', line 98

def map(&block)
  to_a.map(&block)
end

#offset(airtable_offset_key) ⇒ Object



65
66
67
68
# File 'lib/airmodel/query.rb', line 65

def offset(airtable_offset_key)
  params[:offset] = airtable_offset_key
  self
end

#order(order_string) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/airmodel/query.rb', line 54

def order(order_string)
  if order_string
    ordr = order_string.split(" ")
    column = ordr.first
    direction = ordr.length > 1 ? ordr.last.downcase : "asc"
    params[:order] = [column, direction]
  end
  self
end

#paramsObject



9
10
11
12
13
14
15
16
# File 'lib/airmodel/query.rb', line 9

def params
  @params ||= {
    where_clauses: {},
    formulas: [],
    order: @querying_class.default_sort,
    offset: nil
  }
end

#search(args = {}) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/airmodel/query.rb', line 28

def search(args={})
  if args && args[:q] && args[:fields]
    searchfields = if args[:fields].is_a?(String)
                    args[:fields].split(",").map{|f| f.strip }
                   else
                     args[:fields]
                   end
    query = if args[:q].respond_to?(:downcase)
              args[:q].downcase
            else
              args[:q]
            end
    f = "OR(" + searchfields.map{|field|
      # convert strings to case-insensitive searches
      "FIND('#{query}', LOWER({#{field}}))"
    }.join(',') + ")"
    params[:formulas].push f
  end
  self
end

#to_aObject

add kicker methods



76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/airmodel/query.rb', line 76

def to_a
  puts "RUNNING EXPENSIVE API QUERY TO AIRTABLE (#{@querying_class.name})"
  # merge explicit formulas and abstracted where-clauses into one Airtable Formula
  formula = "AND(" + params[:where_clauses].map{|k,v| "{#{k}}='#{v}'" }.join(',') + params[:formulas].join(',') + ")"
  records = @querying_class.table.records(
    sort: params[:order],
    filterByFormula: formula,
    limit: params[:limit],
    offset: params[:offset]
  )
  @offset = records.offset
  @querying_class.classify records
end

#where(args) ⇒ Object



18
19
20
21
# File 'lib/airmodel/query.rb', line 18

def where(args)
  params[:where_clauses].merge!(args)
  self
end