class SQLObject
Public Class Methods
after_initialize(method_name)
click to toggle source
# File lib/activeleopard/sql_object.rb, line 2 def self.after_initialize(method_name) callbacks[:after_initialize] = method_name end
all()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 6 def self.all Relation.new({}, self) end
callbacks()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 10 def self.callbacks @callbacks ||= {} end
columns()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 14 def self.columns return @columns if @columns cols = DBConnection.execute(<<-SQL, [self.table_name]) SELECT column_name FROM information_schema.columns WHERE table_name = $1 SQL @columns = cols.map { |c| c['column_name'].to_sym } end
destroy_all()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 29 def self.destroy_all DBConnection.execute(<<-SQL) DELETE FROM #{self.table_name} SQL end
finalize!()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 35 def self.finalize! self.columns.each do |col| define_method(col) do #setter method attributes[col] end define_method("#{col}=") do |val| #getter method attributes[col] = val end end end
first()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 47 def self.first first_data = DBConnection.get_first_row(<<-SQL) SELECT * FROM #{self.table_name} ORDER BY id LIMIT 1 SQL self.new(first_data) end
last()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 62 def self.last last_data = DBConnection.get_first_row(<<-SQL) SELECT * FROM #{self.table_name} ORDER BY id DESC LIMIT 1 SQL self.new(last_data) end
new(params = {})
click to toggle source
# File lib/activeleopard/sql_object.rb, line 126 def initialize(params = {}) self.class.columns.each do |attr_name| params_val = params[attr_name] || params[attr_name.to_s] params_val.strip! if params_val send("#{attr_name}=", params_val) end params.each do |attr_name, val| attr_method = "#{attr_name}=" next if self.class.columns.include?(attr_name.to_sym) next unless self.respond_to?(attr_method) val.strip! if val send(attr_method, val) end if self.class.callbacks[:after_initialize] send(self.class.callbacks[:after_initialize]) end end
parse_all(all_options)
click to toggle source
# File lib/activeleopard/sql_object.rb, line 77 def self.parse_all(all_options) all_options.map { |options| self.new(options) } end
table_name()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 85 def self.table_name @table_name ||= self.to_s.tableize.gsub('humen') { 'humans' } end
table_name=(table_name)
click to toggle source
# File lib/activeleopard/sql_object.rb, line 81 def self.table_name=(table_name) @table_name = table_name end
validations()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 89 def self.validations @validations ||= [] end
Public Instance Methods
attr_count()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 97 def attr_count @attributes.count end
attr_values_to_update()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 105 def attr_values_to_update attributes.reject { |attr_name, _| attr_name == :id }.values end
attribute_values()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 101 def attribute_values attributes.values end
attributes()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 93 def attributes @attributes ||= {} end
col_names()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 109 def col_names self.class.columns .map(&:to_s) .drop(1).join(', ') end
destroy()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 115 def destroy DBConnection.execute(<<-SQL, [self.id]) DELETE FROM #{self.class.table_name} WHERE id = $1 SQL end
errors()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 122 def errors @errors ||= Hash.new { |h, k| h[k] = [] } end
insert()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 147 def insert result = DBConnection.execute(<<-SQL, attr_values_to_update) INSERT INTO #{self.class.table_name} (#{col_names}) VALUES (#{question_marks}) RETURNING id SQL self.id = result.getvalue(0,0) end
question_marks()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 160 def question_marks (1...attributes.count).map { |n| "$#{n}"}.join(', ') end
save()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 164 def save validate! if valid? id ? update : insert true else show_errors false end end
show_errors()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 175 def show_errors errors.each do |key, messages| messages.each { |m| puts "#{key} #{m}" } end end
to_s()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 181 def to_s "#{self.class}:#{self.object_id}" end
update()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 189 def update vals = attr_values_to_update << id DBConnection.execute(<<-SQL, vals) UPDATE #{self.class.table_name} SET #{update_set_line} WHERE id = $#{vals.length} SQL end
update_set_line()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 185 def update_set_line col_names.split(', ').map.with_index { |c, i| "#{c} = $#{i + 1}" }.join(', ') end
valid?()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 209 def valid? validate! errors.all? { |_, v| v.empty? } end
validate!()
click to toggle source
# File lib/activeleopard/sql_object.rb, line 201 def validate! @errors = Hash.new { |h, k| h[k] = [] } self.class.validations.each do |validation| self.send(validation) end end