Class: Airmodel::Model

Inherits:
Airtable::Record
  • Object
show all
Extended by:
Associable, Utils
Defined in:
lib/airmodel/model.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Utils

-, airtable_formatted, at, base_config, classify, hash_diff, hash_diff!, table_name

Methods included from Associable

default_has_many_contraints, has_many

Class Method Details

.allObject



11
12
13
# File 'lib/airmodel/model.rb', line 11

def self.all
  Query.new(self).all
end

.by_formula(args) ⇒ Object



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

def self.by_formula(args)
  Query.new(self).by_formula(args)
end

.create(*models) ⇒ Object

create a new record and save it to Airtable



74
75
76
77
78
79
80
# File 'lib/airmodel/model.rb', line 74

def self.create(*models)
  results = models.map{|r|
    record = self.new(r)
    table.create(record)
  }
  results.length == 1 ? results.first : results
end

.default_sortObject

default to whatever order Airtable returns override this method if you want to sort by something else



64
65
66
# File 'lib/airmodel/model.rb', line 64

def self.default_sort
  nil
end

.find(id) ⇒ Object

find a record by ID. IF you’ve (1) defined an ‘id’ Field in Airtable, (2) made it a formula, and (3) set the formula to RECORD_ID(), THEN you can pass self.find() and it will return each record in that order. This is mostly only useful for looking up records linked to a particular record.



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/airmodel/model.rb', line 43

def self.find(id)
  if id.is_a? String
    results = self.classify table.find(id)
    results.count == 0 ? nil : results.first
  else
    formula = "OR(" + id.map{|x| "id='#{x}'" }.join(',') + ")"
    self.classify(
      table.records(filterByFormula: formula).sort_by do |x|
        id.index(x.id)
      end
    )
  end
end

.find_by(filters) ⇒ Object

find a record by specified attributes, return it



58
59
60
# File 'lib/airmodel/model.rb', line 58

def self.find_by(filters)
  Query.new(self).find_by(filters)
end

.firstObject

return the first record



69
70
71
# File 'lib/airmodel/model.rb', line 69

def self.first
  Query.new(self).first
end

.inherited(base) ⇒ Object



6
7
8
9
# File 'lib/airmodel/model.rb', line 6

def self.inherited(base)
  Airmodel.warn
  super
end

.limit(args) ⇒ Object

Model.limit(10)



33
34
35
# File 'lib/airmodel/model.rb', line 33

def self.limit(args)
  Query.new(self).limit(args)
end

.order(args) ⇒ Object

Model.order(“Name DESC”)



28
29
30
# File 'lib/airmodel/model.rb', line 28

def self.order(args)
  Query.new(self).order(*args)
end

.patch(id, fields) ⇒ Object

send a PATCH request to update a few fields on a record in one API call



83
84
85
86
# File 'lib/airmodel/model.rb', line 83

def self.patch(id, fields)
  r = table.update_record_fields(id, airtable_formatted(fields))
  self.new(r.fields)
end

.search(args) ⇒ Object



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

def self.search(args)
  Query.new(self).search(args)
end

.where(args) ⇒ Object



15
16
17
# File 'lib/airmodel/model.rb', line 15

def self.where(args)
  Query.new(self).where(args)
end

Instance Method Details

#cache_keyObject



134
135
136
# File 'lib/airmodel/model.rb', line 134

def cache_key
  "#{self.class.table_name}_#{self.id}"
end

#changed_fieldsObject



114
115
116
117
118
# File 'lib/airmodel/model.rb', line 114

def changed_fields
  current = fields
  old = self.class.find_by(id: id).fields
  self.class.hash_diff(current, old)
end

#destroyObject



120
121
122
# File 'lib/airmodel/model.rb', line 120

def destroy
  self.table.destroy(id)
end

#errorsObject

override if you want to return validation errors



144
145
146
# File 'lib/airmodel/model.rb', line 144

def errors
  {}
end

#formatted_fieldsObject



97
98
99
# File 'lib/airmodel/model.rb', line 97

def formatted_fields
  self.class.airtable_formatted(self.fields)
end

#new_record?Boolean

Returns:

  • (Boolean)


130
131
132
# File 'lib/airmodel/model.rb', line 130

def new_record?
  id.nil?
end

#saveObject



101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/airmodel/model.rb', line 101

def save
  if self.valid?
    if new_record?
      self.table.create(self)
    else
      result = self.table.update_record_fields(id, self.changed_fields)
      result
    end
  else
    false
  end
end

#tableObject

return self.class.table. defined as an instance method to allow individual models to override it and connect to a different base in strange circumstances.



93
94
95
# File 'lib/airmodel/model.rb', line 93

def table
  self.class.table
end

#update(fields) ⇒ Object



124
125
126
127
128
# File 'lib/airmodel/model.rb', line 124

def update(fields)
  res = self.table.update_record_fields(id, fields)
  res.fields.each{|field, value| self[field] = value }
  self
end

#valid?Boolean

override if you want to write server-side model validations

Returns:

  • (Boolean)


139
140
141
# File 'lib/airmodel/model.rb', line 139

def valid?
  true
end