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

Parameters:

  • base_module (Module)

    The namespace for created models

  • connection_options (Hash)

    Database connection options

  • base_class_name (Symbol, nil) (defaults to: nil)

    Optional name for the base class



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

Returns:

  • (Class)

    The base class for all models



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

Parameters:

  • table_name (String)

    Name of the database table

  • class_name (String, nil) (defaults to: nil)

    Optional custom class name

Returns:

  • (Class)

    The model class



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

Parameters:

  • table_name (String)

    Name of the database table

  • class_name (String)

    Name for the model class

Returns:

  • (Class)

    The model class



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

Parameters:

  • table_name (String)

    Name of the database table

Returns:

  • (String)

    A valid Ruby class 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