Class: AnonymousActiveRecord::Generator
- Inherits:
-
Object
- Object
- AnonymousActiveRecord::Generator
- Defined in:
- lib/anonymous_active_record/generator.rb
Overview
Generator defines a pseudo anonymous class in a particular namespace of your choosing.
Constant Summary collapse
- DEFAULT_NAME =
"anons"
Instance Attribute Summary collapse
-
#klass_name ⇒ Object
readonly
Returns the value of attribute klass_name.
-
#klass_namespaces ⇒ Object
readonly
Returns the value of attribute klass_namespaces.
-
#parent_klass ⇒ Object
readonly
Returns the value of attribute parent_klass.
-
#table_name ⇒ Object
readonly
Returns the value of attribute table_name.
Instance Method Summary collapse
- #generate(&block) ⇒ Object
-
#initialize(table_name, klass_namespaces = [], klass_basename = nil, parent_klass = "ActiveRecord::Base") ⇒ Generator
constructor
A new instance of Generator.
Constructor Details
#initialize(table_name, klass_namespaces = [], klass_basename = nil, parent_klass = "ActiveRecord::Base") ⇒ Generator
Returns a new instance of Generator.
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/anonymous_active_record/generator.rb', line 21 def initialize(table_name, klass_namespaces = [], klass_basename = nil, parent_klass = "ActiveRecord::Base") @klass_namespaces = Array(klass_namespaces).map(&:to_s).map { |x| x.gsub(/[^a-z0-9]+/i, "_") } klass_context = [ (klass_basename || DEFAULT_NAME).gsub(/[^a-z0-9]+/i, "_").capitalize, SecureRandom.uuid.gsub(/[^a-z0-9]+/i, "_"), ].join("_") @table_name = (table_name || klass_context).downcase.to_s # String#capitalize is Ruby >= 2.4, https://stackoverflow.com/a/3725154/213191 @klass_name = (klass_namespaces << klass_context).join("::") @parent_klass = parent_klass end |
Instance Attribute Details
#klass_name ⇒ Object (readonly)
Returns the value of attribute klass_name.
19 20 21 |
# File 'lib/anonymous_active_record/generator.rb', line 19 def klass_name @klass_name end |
#klass_namespaces ⇒ Object (readonly)
Returns the value of attribute klass_namespaces.
19 20 21 |
# File 'lib/anonymous_active_record/generator.rb', line 19 def klass_namespaces @klass_namespaces end |
#parent_klass ⇒ Object (readonly)
Returns the value of attribute parent_klass.
19 20 21 |
# File 'lib/anonymous_active_record/generator.rb', line 19 def parent_klass @parent_klass end |
#table_name ⇒ Object (readonly)
Returns the value of attribute table_name.
19 20 21 |
# File 'lib/anonymous_active_record/generator.rb', line 19 def table_name @table_name end |
Instance Method Details
#generate(&block) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/anonymous_active_record/generator.rb', line 33 def generate(&block) # Many moons ago, ActiveRecord allowed anonymous classes to be created like: # Class.new(ActiveRecord::Base) # which was useful for specs, and other use cases. But it is now explicitly not supported, see # https://github.com/rails/rails/issues/8934 eval("class ::#{klass_name} < #{parent_klass}; end") klass = Kernel.const_get(klass_name, true) klass.class_eval(&block) if block klass.table_name = table_name klass end |