module ModelBuilder

Constants

TABLE_PREFIX
VERSION

Public Class Methods

build(class_full_name, opts={}) click to toggle source
# File lib/model_builder.rb, line 9
def self.build(class_full_name, opts={})
  opts.reverse_merge! get_default_options

  klass = ClassBuilder.build class_full_name, opts

  unless table_already_exists class_full_name
    create_table class_full_name, opts
    define_table_name klass, class_full_name
    define_validations klass, opts[:validates]
  end

  klass
end
clean() click to toggle source
# File lib/model_builder.rb, line 86
def self.clean
  relevant_database_tables.map {|table| drop_table table }
  @@dynamic_models = []
end
create_attribute(migration, key, opts) click to toggle source
# File lib/model_builder.rb, line 65
def self.create_attribute(migration, key, opts)
  if opts.is_a?(Hash)
    opts = opts.clone
    type = opts.delete :type
  else
    type = opts
    opts = {}
  end
  migration.send(type, key, opts)
end
create_attributes(migration, attributes={}) click to toggle source
# File lib/model_builder.rb, line 59
def self.create_attributes(migration, attributes={})
  attributes.each_pair do |key, value|
    create_attribute(migration, key, value)
  end
end
create_table(class_full_name, opts) click to toggle source
# File lib/model_builder.rb, line 51
def self.create_table(class_full_name, opts)
  ActiveRecord::Migration.create_table(table_name_for(class_full_name)) do |migration|
    create_attributes(migration, opts[:attributes])
  end

  @@dynamic_models << class_full_name
end
database_connection() click to toggle source
# File lib/model_builder.rb, line 42
def self.database_connection
  ActiveRecord::Base.connection
end
database_tables() click to toggle source
# File lib/model_builder.rb, line 38
def self.database_tables
  database_connection.tables
end
define_table_name(klass, class_full_name) click to toggle source
# File lib/model_builder.rb, line 76
def self.define_table_name(klass, class_full_name)
  klass.table_name = table_name_for(class_full_name)
end
define_validations(klass, validations) click to toggle source
# File lib/model_builder.rb, line 80
def self.define_validations(klass, validations)
  return if validations.nil? or !validations.kind_of?(Array) or validations.empty?
  validations = [validations] unless validations.first.kind_of? Array
  validations.each {|v| klass.validates *v}
end
drop_table(table) click to toggle source
# File lib/model_builder.rb, line 95
def self.drop_table(table)
  ActiveRecord::Migration.drop_table(table)
end
dynamic_models() click to toggle source
# File lib/model_builder.rb, line 91
def self.dynamic_models
  @@dynamic_models
end
get_default_options() click to toggle source
# File lib/model_builder.rb, line 23
def self.get_default_options
  {
    superclass: ::ActiveRecord::Base,
    attributes: {}
  }
end
relevant_database_tables() click to toggle source
# File lib/model_builder.rb, line 34
def self.relevant_database_tables
  database_tables.select {|table| table.starts_with? TABLE_PREFIX }
end
table_already_exists(class_full_name) click to toggle source
# File lib/model_builder.rb, line 30
def self.table_already_exists(class_full_name)
  relevant_database_tables.include? table_name_for(class_full_name)
end
table_name_for(class_full_name) click to toggle source
# File lib/model_builder.rb, line 46
def self.table_name_for(class_full_name)
  table_name = class_full_name.tableize.gsub(/\//,'_')
  "#{TABLE_PREFIX}#{table_name}"
end