Class: DynamicActiveModel::Factory

Inherits:
Object
  • Object
show all
Defined in:
lib/dynamic-active-model/factory.rb

Overview

DynamicActiveModel::Factory creates ActiveRecord class for tables

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base_module, connection_options, base_class_name = nil) ⇒ Factory

Returns a new instance of Factory.



8
9
10
11
12
# File 'lib/dynamic-active-model/factory.rb', line 8

def initialize(base_module, connection_options, base_class_name = nil)
  @base_module = base_module
  @connection_options = connection_options
  @base_class_name = base_class_name || :DynamicAbstractBase
end

Instance Attribute Details

#base_classObject

rubocop:disable MethodLength



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/dynamic-active-model/factory.rb', line 31

def base_class
  @base_class ||=
    begin
      require 'active_record'

      unless @base_module.const_defined?(@base_class_name)
        new_base_class = Class.new(ActiveRecord::Base) do
          self.abstract_class = true
        end
        @base_module.const_set(@base_class_name, new_base_class)
      end

      @base_module.const_get(@base_class_name).tap do |kls|
        kls.establish_connection @connection_options
      end
    end
end

Instance Method Details

#create(table_name, class_name = nil) ⇒ Object



14
15
16
17
18
# File 'lib/dynamic-active-model/factory.rb', line 14

def create(table_name, class_name = nil)
  class_name ||= generate_class_name(table_name)
  create!(table_name, class_name) unless @base_module.const_defined?(class_name)
  @base_module.const_get(class_name)
end

#create!(table_name, class_name) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'lib/dynamic-active-model/factory.rb', line 20

def create!(table_name, class_name)
  kls = Class.new(base_class) do
    self.table_name = table_name
    include DynamicActiveModel::DangerousAttributesPatch
  end
  @base_module.const_set(class_name, kls)
  require_extension(class_name)
  @base_module.const_get(class_name)
end

#generate_class_name(table_name) ⇒ Object

rubocop:enable MethodLength



50
51
52
53
54
55
# File 'lib/dynamic-active-model/factory.rb', line 50

def generate_class_name(table_name)
  class_name = table_name.classify
  return ('N' + class_name) if class_name =~ /\A\d/

  class_name  
end

#require_extension(class_name) ⇒ Object



57
58
59
60
61
62
# File 'lib/dynamic-active-model/factory.rb', line 57

def require_extension(class_name)
  file = File.expand_path(DynamicActiveModel.base_models_path + '/' + class_name.underscore + '.rb')
  return unless File.exist?(file)

  require file
end