Sha256: 4da3d1dd7876ec524c72256339bfeea10f35686f84d35649386b39c299a3c302

Contents?: true

Size: 1.52 KB

Versions: 1

Compression:

Stored size: 1.52 KB

Contents

module ActiveTable
  class Base < ActiveRecord::Base
    @@tables = {}
    def self.active_table(&block)
      block.call
      ActiveRecord::Base.connection_pool.connections.each do |connection|
        create_tables(connection)
      end
      self.reset_column_information
      self.define_attribute_methods
    end

    def self.create_table(name, options = {}, &block)
      class_name = self.name
      self.set_table_name name
      @@tables[class_name] = {:name => name, :options => options, :block => block, :rows => []}
    end

    def self.insert(params)
      class_name = self.name
      @@tables[class_name][:rows] << params
    end

    def self.create_tables(connection)
      @@tables.each_value do |table|
        next if connection.active_table_loaded_for?(table[:name])
        connection.create_table table[:name], table[:options].merge(:temporary => true) do |t|
          table[:block].call(t)
        end

        table[:rows].each do |row|
          connection.execute generate_insert_sql_for_hash(connection, table[:name], row)
        end
        connection.mark_active_table_as_loaded(table[:name])
      end
    end

    def self.generate_insert_sql_for_hash(connection, table_name, params)
      keys = params.keys.map {|k| connection.quote_column_name(k.to_s)}.join(", ")
      values = params.values.map {|v| connection.quote(v.to_s)}.join(", ")
      "INSERT INTO #{connection.quote_table_name(table_name.to_s)} (#{keys}) VALUES (#{values})"
    end

    def self.reset_table_information
      @@tables = {}
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
active_table-0.0.3 lib/active_table/base.rb