Module: ModelBuilder

Defined in:
lib/model_builder.rb,
lib/model_builder/version.rb,
lib/model_builder/class_builder.rb

Defined Under Namespace

Modules: ClassBuilder

Constant Summary collapse

TABLE_PREFIX =
"model_builder/"
VERSION =
'2.2.2'

Class Method Summary collapse

Class Method Details

.build(class_full_name, opts = {}) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
# 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

.cleanObject



86
87
88
89
# 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) ⇒ Object



65
66
67
68
69
70
71
72
73
74
# 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 = {}) ⇒ Object



59
60
61
62
63
# 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) ⇒ Object



51
52
53
54
55
56
57
# 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_connectionObject



42
43
44
# File 'lib/model_builder.rb', line 42

def self.database_connection
  ActiveRecord::Base.connection
end

.database_tablesObject



38
39
40
# File 'lib/model_builder.rb', line 38

def self.database_tables
  database_connection.tables
end

.define_table_name(klass, class_full_name) ⇒ Object



76
77
78
# 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) ⇒ Object



80
81
82
83
84
# 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) ⇒ Object



95
96
97
# File 'lib/model_builder.rb', line 95

def self.drop_table(table)
  ActiveRecord::Migration.drop_table(table)
end

.dynamic_modelsObject



91
92
93
# File 'lib/model_builder.rb', line 91

def self.dynamic_models
  @@dynamic_models
end

.get_default_optionsObject



23
24
25
26
27
28
# File 'lib/model_builder.rb', line 23

def self.get_default_options
  {
    superclass: ::ActiveRecord::Base,
    attributes: {}
  }
end

.relevant_database_tablesObject



34
35
36
# 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) ⇒ Object



30
31
32
# 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) ⇒ Object



46
47
48
49
# 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