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