Class: SQLObject

Inherits:
Object
  • Object
show all
Extended by:
Associatable, Searchable
Defined in:
lib/easy_save/sql_object.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Searchable

where

Methods included from Associatable

assoc_options, belongs_to, has_many, has_one_through

Constructor Details

#initialize(params = {}) ⇒ SQLObject

Returns a new instance of SQLObject.



85
86
87
88
89
90
91
92
# File 'lib/easy_save/sql_object.rb', line 85

def initialize(params = {})
  params.each do |attr_name, val|
    unless self.class.columns.include?(attr_name.to_sym)
      raise "unknown attribute '#{attr_name}'"
    end
    self.send("#{attr_name}=", val)
  end
end

Class Method Details

.allObject



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/easy_save/sql_object.rb', line 42

def self.all
  sql = <<-SQL
    SELECT
      *
    FROM
      #{self.table_name}
  SQL

  results = DBConnection.execute(sql)
  self.parse_all(results)
end

.columnsObject



22
23
24
25
# File 'lib/easy_save/sql_object.rb', line 22

def self.columns
  self.first_row 
  @results.first.map(&:to_sym)
end

.finalize!Object



27
28
29
30
31
32
# File 'lib/easy_save/sql_object.rb', line 27

def self.finalize!
  self.columns.each do |col|
    define_method(col) { attributes[col] }
    define_method("#{col}=") { |val| attributes[col] = val }
  end
end

.find(id) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/easy_save/sql_object.rb', line 58

def self.find(id)
  sql = <<-SQL
    SELECT
      *
    FROM
      #{self.table_name}
    WHERE
      id = ?
  SQL

  result = DBConnection.execute(sql, id).first
  result ? new(result) : nil
end

.firstObject



72
73
74
75
76
77
78
79
80
81
# File 'lib/easy_save/sql_object.rb', line 72

def self.first 
  sql = <<-SQL 
    SELECT 
      * 
    FROM 
      #{self.table_name}
  SQL
  result = DBConnection.execute(sql).first
  result ? new(result) : nil
end

.first_rowObject



11
12
13
14
15
16
17
18
19
20
# File 'lib/easy_save/sql_object.rb', line 11

def self.first_row
  sql = <<-SQL
  SELECT
    *
  FROM
    #{table_name}
  SQL

  @results ||= DBConnection.execute2(sql)
end

.parse_all(results) ⇒ Object



54
55
56
# File 'lib/easy_save/sql_object.rb', line 54

def self.parse_all(results)
  results.inject([]) { |final, res|  final.push(new(res)) } 
end

.table_nameObject



38
39
40
# File 'lib/easy_save/sql_object.rb', line 38

def self.table_name
  @table_name ||= self.to_s.tableize
end

.table_name=(table_name) ⇒ Object



34
35
36
# File 'lib/easy_save/sql_object.rb', line 34

def self.table_name=(table_name)
  @table_name = table_name
end

Instance Method Details

#attribute_valuesObject



98
99
100
# File 'lib/easy_save/sql_object.rb', line 98

def attribute_values
  @attributes.values
end

#attributesObject



94
95
96
# File 'lib/easy_save/sql_object.rb', line 94

def attributes
  @attributes ||= {}
end

#insertObject



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/easy_save/sql_object.rb', line 102

def insert
  col_names = self.class.columns.drop(1).join(", ")
  question_marks = (["?"] * (self.class.columns.length - 1)).join(", ")

  col_names = "(#{col_names})"
  question_marks = "(#{question_marks})"

  sql = <<-SQL
    INSERT INTO
      #{self.class.table_name} #{col_names}
    VALUES
      #{question_marks}
  SQL

  DBConnection.execute(sql, attribute_values)
  self.id = DBConnection.last_insert_row_id
end

#saveObject



137
138
139
# File 'lib/easy_save/sql_object.rb', line 137

def save
  id.nil? ? insert : update
end

#updateObject



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/easy_save/sql_object.rb', line 120

def update
  set_values = self.class.columns.map do |el|
    "#{el} = ?"
  end.join(', ')

  sql = <<-SQL
    UPDATE
      #{self.class.table_name}
    SET
      #{set_values}
    WHERE
      id = #{id}
  SQL

  DBConnection.execute(sql, *attribute_values)
end