Class: Tina4::ORM
Class Method Summary collapse
- .all(limit: nil, skip: nil, order_by: nil) ⇒ Object
- .count(conditions = nil, params = []) ⇒ Object
- .create(attributes = {}) ⇒ Object
- .db ⇒ Object
- .find(id) ⇒ Object
- .from_hash(hash) ⇒ Object
- .where(conditions, params = []) ⇒ Object
Instance Method Summary collapse
- #delete ⇒ Object
- #errors ⇒ Object
-
#initialize(attributes = {}) ⇒ ORM
constructor
A new instance of ORM.
- #load(id = nil) ⇒ Object
- #persisted? ⇒ Boolean
- #save ⇒ Object
- #select(*fields) ⇒ Object
- #to_hash(exclude_nil: false) ⇒ Object
- #to_json(*_args) ⇒ Object
- #to_s ⇒ Object
Methods included from FieldTypes
Constructor Details
#initialize(attributes = {}) ⇒ ORM
Returns a new instance of ORM.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/tina4/orm.rb', line 57 def initialize(attributes = {}) @persisted = false @errors = [] attributes.each do |key, value| setter = "#{key}=" send(setter, value) if respond_to?(setter) end # Set defaults self.class.field_definitions.each do |name, opts| if send(name).nil? && opts[:default] send("#{name}=", opts[:default]) end end end |
Class Method Details
.all(limit: nil, skip: nil, order_by: nil) ⇒ Object
26 27 28 29 30 31 |
# File 'lib/tina4/orm.rb', line 26 def all(limit: nil, skip: nil, order_by: nil) sql = "SELECT * FROM #{table_name}" sql += " ORDER BY #{order_by}" if order_by results = db.fetch(sql, [], limit: limit, skip: skip) results.map { |row| from_hash(row) } end |
.count(conditions = nil, params = []) ⇒ Object
33 34 35 36 37 38 |
# File 'lib/tina4/orm.rb', line 33 def count(conditions = nil, params = []) sql = "SELECT COUNT(*) as cnt FROM #{table_name}" sql += " WHERE #{conditions}" if conditions result = db.fetch_one(sql, params) result[:cnt].to_i end |
.create(attributes = {}) ⇒ Object
40 41 42 43 44 |
# File 'lib/tina4/orm.rb', line 40 def create(attributes = {}) instance = new(attributes) instance.save instance end |
.find(id) ⇒ Object
13 14 15 16 17 18 |
# File 'lib/tina4/orm.rb', line 13 def find(id) pk = primary_key_field || :id result = db.fetch_one("SELECT * FROM #{table_name} WHERE #{pk} = ?", [id]) return nil unless result from_hash(result) end |
.from_hash(hash) ⇒ Object
46 47 48 49 50 51 52 53 54 |
# File 'lib/tina4/orm.rb', line 46 def from_hash(hash) instance = new hash.each do |key, value| setter = "#{key}=" instance.send(setter, value) if instance.respond_to?(setter) end instance.instance_variable_set(:@persisted, true) instance end |
.where(conditions, params = []) ⇒ Object
20 21 22 23 24 |
# File 'lib/tina4/orm.rb', line 20 def where(conditions, params = []) sql = "SELECT * FROM #{table_name} WHERE #{conditions}" results = db.fetch(sql, params) results.map { |row| from_hash(row) } end |
Instance Method Details
#delete ⇒ Object
98 99 100 101 102 103 104 105 106 |
# File 'lib/tina4/orm.rb', line 98 def delete pk = self.class.primary_key_field || :id pk_value = send(pk) return false unless pk_value self.class.db.delete(self.class.table_name, { pk => pk_value }) @persisted = false true end |
#errors ⇒ Object
128 129 130 |
# File 'lib/tina4/orm.rb', line 128 def errors @errors end |
#load(id = nil) ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/tina4/orm.rb', line 108 def load(id = nil) pk = self.class.primary_key_field || :id id ||= send(pk) return false unless id result = self.class.db.fetch_one("SELECT * FROM #{self.class.table_name} WHERE #{pk} = ?", [id]) return false unless result result.each do |key, value| setter = "#{key}=" send(setter, value) if respond_to?(setter) end @persisted = true true end |
#persisted? ⇒ Boolean
124 125 126 |
# File 'lib/tina4/orm.rb', line 124 def persisted? @persisted end |
#save ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/tina4/orm.rb', line 72 def save @errors = [] validate_fields return false unless @errors.empty? data = to_hash(exclude_nil: true) pk = self.class.primary_key_field || :id pk_value = send(pk) if @persisted && pk_value filter = { pk => pk_value } data.delete(pk) self.class.db.update(self.class.table_name, data, filter) else result = self.class.db.insert(self.class.table_name, data) if result[:last_id] && respond_to?("#{pk}=") send("#{pk}=", result[:last_id]) end @persisted = true end true rescue => e @errors << e. false end |
#select(*fields) ⇒ Object
150 151 152 153 154 155 |
# File 'lib/tina4/orm.rb', line 150 def select(*fields) fields_str = fields.map(&:to_s).join(", ") pk = self.class.primary_key_field || :id pk_value = send(pk) self.class.db.fetch_one("SELECT #{fields_str} FROM #{self.class.table_name} WHERE #{pk} = ?", [pk_value]) end |
#to_hash(exclude_nil: false) ⇒ Object
132 133 134 135 136 137 138 139 140 |
# File 'lib/tina4/orm.rb', line 132 def to_hash(exclude_nil: false) hash = {} self.class.field_definitions.each_key do |name| value = send(name) next if exclude_nil && value.nil? hash[name] = value end hash end |
#to_json(*_args) ⇒ Object
142 143 144 |
# File 'lib/tina4/orm.rb', line 142 def to_json(*_args) JSON.generate(to_hash) end |
#to_s ⇒ Object
146 147 148 |
# File 'lib/tina4/orm.rb', line 146 def to_s "#<#{self.class.name} #{to_hash}>" end |