-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsaveable.rb
65 lines (54 loc) · 1.3 KB
/
saveable.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
module Saveable
def instance_variable_symbols
iv = self.instance_variables
iv.delete(:@id)
iv << :@id
end
def make_question_marks(n)
[].tap do |qs|
n.times {qs << '?'}
end.join(', ')
end
def make_insert_str(arr)
arr.map do |var|
var.to_s[1..-1]
end.join(', ')
end
def make_update_str(arr)
arr.map do |var|
var.to_s[1..-1] + ' = ?'
end.join(', ')
end
def instance_variable_values
instance_variable_symbols.map do |var|
self.instance_variable_get(var)
end
end
def save
iv_insert_values = instance_variable_values[0...-1]
iv_insert_symbols = instance_variable_symbols[0...-1]
insert_str = make_insert_str(iv_insert_symbols)
insert_q_marks = make_question_marks(iv_insert_values.count)
iv_update_values = instance_variable_values
update_str = make_update_str(iv_insert_symbols)
if id.nil?
QuestionDatabase.instance.execute(<<-SQL, insert_str, insert_q_marks, *iv_insert_values)
INSERT INTO
users(?)
VALUES
(?)
SQL
@id = QuestionDatabase.instance.last_insert_row_id
else
QuestionDatabase.instance.execute(<<-SQL, update_str, *iv_update_values)
UPDATE
users
SET
?
WHERE
id = ?
SQL
end
nil
end
end