class ASeriesOfTubes::TubeRecord::SQLObject

Public Class Methods

all() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 13
      def self.all
        self.parse_all(DBConnection.execute(<<-SQL))
          SELECT
            *
          FROM
            #{self.table_name}
        SQL
      end
columns() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 4
      def self.columns
        @columns ||= DBConnection.execute2(<<-SQL).first.map(&:to_sym)
          SELECT
            *
          FROM
            #{self.table_name}
        SQL
      end
finalize!() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 41
def self.finalize!
  self.columns.each do |column|
    define_method(column) { self.attributes[column] }
    define_method("#{column}=") { |value| self.attributes[column] = value }
  end
end
find(id) click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 26
      def self.find(id)
        result = DBConnection.execute(<<-SQL, id: id).first
          SELECT
            *
          FROM
            #{self.table_name}
          WHERE
            #{self.table_name}.id = :id
          LIMIT
            1
        SQL

        self.new(result) if result
      end
new(params = {}) click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 56
def initialize(params = {})
  params.each do |attr_name, value|
    if self.class.columns.include?(attr_name.to_sym)
      self.send("#{attr_name}=", value)
    else
      raise "unknown attribute '#{attr_name}'"
    end
  end
end
parse_all(results) click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 22
def self.parse_all(results)
  results.map { |params| self.new(params) }
end
table_name() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 48
def self.table_name
  @table_name ||= self.to_s.tableize
end
table_name=(table_name) click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 52
def self.table_name=(table_name)
  @table_name = table_name
end

Public Instance Methods

attribute_values() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 70
def attribute_values
  @attributes.keys.map { |k| @attributes[k] }
end
attributes() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 66
def attributes
  @attributes ||= {}
end
destroy() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 106
      def destroy
        return unless self.id

        ASeriesOfTubes::TubeRecord::DBConnection.execute(<<-SQL)
          DELETE FROM
            #{self.class.table_name}
          WHERE
            id = #{self.id}
        SQL
      end
insert() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 74
      def insert
        columns = self.class.columns.drop(1)
        question_marks = (['?'] * columns.length)

        ASeriesOfTubes::TubeRecord::DBConnection.execute(<<-SQL, *attribute_values)
          INSERT INTO
            #{self.class.table_name} (#{columns.join(',')})
          VALUES
            (#{question_marks.join(',')})
        SQL

        self.id = ASeriesOfTubes::TubeRecord::DBConnection.last_insert_row_id
      end
save() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 102
def save
  self.id ? self.update : self.insert
end
update() click to toggle source
# File lib/a_series_of_tubes/tube_record/sql_object.rb, line 88
      def update
        columns = self.class.columns
        set_values = columns.map { |attr_name| "#{attr_name} = ?" }

        ASeriesOfTubes::TubeRecord::DBConnection.execute(<<-SQL, *attribute_values)
          UPDATE
            #{self.class.table_name}
          SET
            #{set_values.join(',')}
          WHERE
            id = #{self.id}
        SQL
      end