Class: DynamicActiveModel::Factory

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

Overview

The Factory class is responsible for creating ActiveRecord model classes from database tables. It handles:

  • Base class creation and connection setup

  • Model class generation with proper naming

  • Table name assignment

  • Safety patches for dangerous attributes

Examples:

Basic Usage

factory = DynamicActiveModel::Factory.new(DB, database_config)
model = factory.create('users')

With Custom Class Name

factory = DynamicActiveModel::Factory.new(DB, database_config)
model = factory.create('users', 'CustomUser')

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Initializes a new Factory instance



26
27
28
29
30
# File 'lib/dynamic-active-model/factory.rb', line 26

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_classClass

Gets or creates the base class for all models This method:

  1. Creates an abstract ActiveRecord::Base subclass if needed

  2. Establishes the database connection

  3. Returns the configured base class



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/dynamic-active-model/factory.rb', line 61

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) ⇒ Class

Creates a new model class for a table if it doesn’t exist



36
37
38
39
40
# File 'lib/dynamic-active-model/factory.rb', line 36

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) ⇒ Class

Creates a new model class for a table, overwriting if it exists



46
47
48
49
50
51
52
53
# File 'lib/dynamic-active-model/factory.rb', line 46

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)
  @base_module.const_get(class_name)
end

#generate_class_name(table_name) ⇒ String

Generates a valid Ruby class name from a table name



82
83
84
85
86
87
# File 'lib/dynamic-active-model/factory.rb', line 82

def generate_class_name(table_name)
  class_name = table_name.classify
  return "N#{class_name}" if class_name =~ /\A\d/

  class_name
end