Class: Puffs::SQLObject
Overview
require_relative ‘../puffs’
Constant Summary
collapse
- RELATION_METHODS =
[
:limit, :includes, :where, :order
]
Class Method Summary
collapse
Instance Method Summary
collapse
assoc_options, belongs_to, has_many, has_many_through, has_one_through
Constructor Details
#initialize(params = {}) ⇒ SQLObject
Returns a new instance of SQLObject.
88
89
90
91
92
93
94
95
96
|
# File 'lib/sql_object/sql_object.rb', line 88
def initialize(params = {})
params.each do |attr_name, value|
unless self.class.columns.include?(attr_name.to_sym)
raise "unknown attribute '#{attr_name}'"
end
self.send("#{attr_name}=", value)
end
end
|
Class Method Details
.all ⇒ Object
20
21
22
|
# File 'lib/sql_object/sql_object.rb', line 20
def self.all
where({})
end
|
.columns ⇒ Object
24
25
26
|
# File 'lib/sql_object/sql_object.rb', line 24
def self.columns
DBConnection.columns(table_name)
end
|
.count ⇒ Object
28
29
30
|
# File 'lib/sql_object/sql_object.rb', line 28
def self.count
all.count
end
|
.define_singleton_method_by_proc(obj, name, block) ⇒ Object
32
33
34
35
|
# File 'lib/sql_object/sql_object.rb', line 32
def self.define_singleton_method_by_proc(obj, name, block)
metaclass = class << obj; self; end
metaclass.send(:define_method, name, block)
end
|
.destroy_all! ⇒ Object
37
38
39
40
41
|
# File 'lib/sql_object/sql_object.rb', line 37
def self.destroy_all!
self.all.each do |entry|
entry.destroy!
end
end
|
.finalize! ⇒ Object
43
44
45
46
47
48
49
50
51
52
53
|
# File 'lib/sql_object/sql_object.rb', line 43
def self.finalize!
self.columns.each do |column|
define_method(column) do
attributes[column]
end
define_method("#{column}=") do |new_value|
attributes[column] = new_value
end
end
end
|
.find(id) ⇒ Object
55
56
57
|
# File 'lib/sql_object/sql_object.rb', line 55
def self.find(id)
where(id: id).first
end
|
.first ⇒ Object
59
60
61
|
# File 'lib/sql_object/sql_object.rb', line 59
def self.first
all.limit(1).first
end
|
.has_association?(association) ⇒ Boolean
63
64
65
|
# File 'lib/sql_object/sql_object.rb', line 63
def self.has_association?(association)
assoc_options.keys.include?(association)
end
|
.last ⇒ Object
67
68
69
|
# File 'lib/sql_object/sql_object.rb', line 67
def self.last
all.order(id: :desc).limit(1).first
end
|
.parse_all(results) ⇒ Object
71
72
73
74
75
76
77
78
|
# File 'lib/sql_object/sql_object.rb', line 71
def self.parse_all(results)
relation = Puffs::SQLRelation.new(klass: self, loaded: true)
results.each do |result|
relation << self.new(result)
end
relation
end
|
.table_name ⇒ Object
84
85
86
|
# File 'lib/sql_object/sql_object.rb', line 84
def self.table_name
@table_name ||= self.to_s.downcase.tableize
end
|
.table_name=(table_name) ⇒ Object
80
81
82
|
# File 'lib/sql_object/sql_object.rb', line 80
def self.table_name=(table_name)
@table_name = table_name
end
|
Instance Method Details
#attribute_values ⇒ Object
102
103
104
105
106
|
# File 'lib/sql_object/sql_object.rb', line 102
def attribute_values
self.class.columns.map do |column|
self.send(column)
end
end
|
#attributes ⇒ Object
98
99
100
|
# File 'lib/sql_object/sql_object.rb', line 98
def attributes
@attributes ||= {}
end
|
#destroy! ⇒ Object
108
109
110
111
112
113
114
115
116
117
118
119
|
# File 'lib/sql_object/sql_object.rb', line 108
def destroy!
if self.class.find(id)
DBConnection.execute(<<-SQL)
DELETE
FROM
#{self.class.table_name}
WHERE
id = #{id}
SQL
return self
end
end
|
#insert ⇒ Object
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
# File 'lib/sql_object/sql_object.rb', line 121
def insert
columns = self.class.columns.reject { |col| col == :id }
column_values = columns.map {|attr_name| send(attr_name)}
column_names = columns.join(", ")
bind_params = (1..columns.length).map {|n| "$#{n}"}.join(", ")
result = DBConnection.execute(<<-SQL, column_values)
INSERT INTO
#{self.class.table_name} (#{column_names})
VALUES
(#{bind_params})
RETURNING id;
SQL
self.id = result.first['id']
self
end
|
#save ⇒ Object
137
138
139
|
# File 'lib/sql_object/sql_object.rb', line 137
def save
self.class.find(id) ? update : insert
end
|
#update ⇒ Object
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
# File 'lib/sql_object/sql_object.rb', line 141
def update
set_line = self.class.columns.map do |column|
"#{column} = \'#{self.send(column)}\'"
end.join(", ")
DBConnection.execute(<<-SQL)
UPDATE
#{self.class.table_name}
SET
#{set_line}
WHERE
id = #{id}
SQL
self
end
|