Class: Airmodel::Model
- Inherits:
-
Airtable::Record
- Object
- Airtable::Record
- Airmodel::Model
- Extended by:
- Associable, Utils
- Defined in:
- lib/airmodel/model.rb
Class Method Summary collapse
- .all ⇒ Object
- .by_formula(args) ⇒ Object
-
.create(*models) ⇒ Object
create a new record and save it to Airtable.
-
.default_sort ⇒ Object
default to whatever order Airtable returns override this method if you want to sort by something else.
-
.find(id) ⇒ Object
find a record by ID.
-
.find_by(filters) ⇒ Object
find a record by specified attributes, return it.
-
.first ⇒ Object
return the first record.
- .inherited(base) ⇒ Object
-
.limit(args) ⇒ Object
Model.limit(10).
-
.order(args) ⇒ Object
Model.order(“Name DESC”).
-
.patch(id, fields) ⇒ Object
send a PATCH request to update a few fields on a record in one API call.
- .search(args) ⇒ Object
- .where(args) ⇒ Object
Instance Method Summary collapse
- #cache_key ⇒ Object
- #changed_fields ⇒ Object
- #destroy ⇒ Object
-
#errors ⇒ Object
override if you want to return validation errors.
- #formatted_fields ⇒ Object
- #new_record? ⇒ Boolean
- #save ⇒ Object
-
#table ⇒ Object
return self.class.table.
- #update(fields) ⇒ Object
-
#valid? ⇒ Boolean
override if you want to write server-side model validations.
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
.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_sort ⇒ Object
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 |
.first ⇒ Object
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 |
Instance Method Details
#cache_key ⇒ Object
134 135 136 |
# File 'lib/airmodel/model.rb', line 134 def cache_key "#{self.class.table_name}_#{self.id}" end |
#changed_fields ⇒ Object
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 |
#destroy ⇒ Object
120 121 122 |
# File 'lib/airmodel/model.rb', line 120 def destroy self.table.destroy(id) end |
#errors ⇒ Object
override if you want to return validation errors
144 145 146 |
# File 'lib/airmodel/model.rb', line 144 def errors {} end |
#formatted_fields ⇒ Object
97 98 99 |
# File 'lib/airmodel/model.rb', line 97 def formatted_fields self.class.airtable_formatted(self.fields) end |
#new_record? ⇒ Boolean
130 131 132 |
# File 'lib/airmodel/model.rb', line 130 def new_record? id.nil? end |
#save ⇒ Object
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 |
#table ⇒ Object
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
139 140 141 |
# File 'lib/airmodel/model.rb', line 139 def valid? true end |