Class: Tina4::ORM

Inherits:
Object
  • Object
show all
Includes:
FieldTypes
Defined in:
lib/tina4/orm.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from FieldTypes

included

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

.dbObject



9
10
11
# File 'lib/tina4/orm.rb', line 9

def db
  Tina4.database
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

#deleteObject



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

#errorsObject



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

Returns:

  • (Boolean)


124
125
126
# File 'lib/tina4/orm.rb', line 124

def persisted?
  @persisted
end

#saveObject



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.message
  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_sObject



146
147
148
# File 'lib/tina4/orm.rb', line 146

def to_s
  "#<#{self.class.name} #{to_hash}>"
end