Class: DynamicActiveModel::Factory
- Inherits:
-
Object
- Object
- DynamicActiveModel::Factory
- 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
Instance Attribute Summary collapse
-
#base_class ⇒ Class
Gets or creates the base class for all models This method: 1.
Instance Method Summary collapse
-
#create(table_name, class_name = nil) ⇒ Class
Creates a new model class for a table if it doesn’t exist.
-
#create!(table_name, class_name) ⇒ Class
Creates a new model class for a table, overwriting if it exists.
-
#generate_class_name(table_name) ⇒ String
Generates a valid Ruby class name from a table name.
-
#initialize(base_module, connection_options, base_class_name = nil) ⇒ Factory
constructor
Initializes a new Factory instance.
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, , base_class_name = nil) @base_module = base_module @connection_options = @base_class_name = base_class_name || :DynamicAbstractBase end |
Instance Attribute Details
#base_class ⇒ Class
Gets or creates the base class for all models This method:
-
Creates an abstract ActiveRecord::Base subclass if needed
-
Establishes the database connection
-
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 |