class Bartleby::Objectifier

Public Class Methods

all() click to toggle source
# File lib/bartleby/objectifier.rb, line 38
    def self.all
      results = Connection.execute(<<-SQL)
        SELECT
          *
        FROM
          '#{table_name}'
      SQL

      parse_all(results)
    end
columns() click to toggle source
# File lib/bartleby/objectifier.rb, line 11
    def self.columns
      return @columns.dup if @columns
      # ...
      @columns = Connection.execute2(<<-SQL).first.map(&:to_sym)
        SELECT
          *
        FROM
          '#{table_name}'
      SQL
      @columns.dup
    end
finalize!() click to toggle source
# File lib/bartleby/objectifier.rb, line 23
def self.finalize!
  columns.each do |column|
    create_getter!(column)
    create_setter!(column)
  end
end
find(id) click to toggle source
# File lib/bartleby/objectifier.rb, line 53
    def self.find(id)
      result = Connection.execute(<<-SQL, id)
        SELECT
          *
        FROM
          '#{table_name}'
        WHERE
          id = ?
      SQL

      result.empty? ? nil : self.new(result.first)
    end
new(params = {}) click to toggle source
# File lib/bartleby/objectifier.rb, line 66
def initialize(params = {})
  params.each do |attr_name, value|
    raise "unknown attribute '#{attr_name}'" unless valid_attribute? attr_name
    send("#{attr_name}=".to_sym, value)
  end
end
parse_all(results) click to toggle source
# File lib/bartleby/objectifier.rb, line 49
def self.parse_all(results)
  results.map { |result| self.new(result) }
end
table_name() click to toggle source
# File lib/bartleby/objectifier.rb, line 34
def self.table_name
  @table_name || self.name.tableize
end
table_name=(table_name) click to toggle source
# File lib/bartleby/objectifier.rb, line 30
def self.table_name=(table_name)
  @table_name = table_name
end

Private Class Methods

create_getter!(column) click to toggle source
# File lib/bartleby/objectifier.rb, line 124
def self.create_getter!(column)
  define_method(column) do
    attributes[column]
  end
end
create_setter!(column) click to toggle source
# File lib/bartleby/objectifier.rb, line 130
def self.create_setter!(column)!
  setter_name = "#{column}=".to_sym
  define_method(setter_name) do |value|
    attributes[column] = value
  end
end

Public Instance Methods

attribute_values() click to toggle source
# File lib/bartleby/objectifier.rb, line 77
def attribute_values
  self.class.columns.map { |col| send(col) }
end
attributes() click to toggle source
# File lib/bartleby/objectifier.rb, line 73
def attributes
  @attributes ||= {}
end
insert() click to toggle source
# File lib/bartleby/objectifier.rb, line 81
    def insert
      cols = self.class.columns
      cols.delete(:id)
      col_names = cols.join(", ")
      question_marks = (["?"] * (self.class.columns.count  - 1)).join(", ")
      id_idx = self.class.columns.index(:id)
      values = attribute_values
      values.delete_at(id_idx)

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

      Connection.execute(query_string, *values)
      self.id = Connection.last_insert_row_id
    end
save() click to toggle source
# File lib/bartleby/objectifier.rb, line 118
def save
  id.nil? ? insert : update
end
update() click to toggle source
# File lib/bartleby/objectifier.rb, line 101
    def update
      cols = self.class.columns
      cols.delete(:id)
      set_string = cols.map { |col| "#{col} = :#{col}"}.join(", ")

      query_string = <<-SQL
        UPDATE
          #{self.class.table_name}
        SET
          #{set_string}
        WHERE
          id = :id
      SQL

      Connection.execute(query_string, attributes)
    end

Private Instance Methods

valid_attribute?(attr_name) click to toggle source
# File lib/bartleby/objectifier.rb, line 137
def valid_attribute?(attr_name)
  self.class.columns.include? attr_name.to_sym
end