Sha256: 435f416ba47c363790d2f7511f9278a3f142133443f199869cdfeaebcfdc2728

Contents?: true

Size: 1.59 KB

Versions: 7

Compression:

Stored size: 1.59 KB

Contents

#   Usage:
#
#     klass = AnonymousActiveRecord.generate(columns: ['name']) do
#               def flowery_name
#                 "🌸#{name}🌸"
#               end
#             end
#     instance = klass.new(name: 'Darla Charla')
#     instance.save!
#     instance.flowery_name # => "🌸Darla Charla🌸"
#
module AnonymousActiveRecord
  # Generator defines a pseudo anonymous class in a particular namespace of your choosing.
  class Generator
    DEFAULT_NAME = 'anons'.freeze

    attr_reader :klass_namespaces, :table_name, :klass_name

    def initialize(table_name, klass_namespaces = [], klass_basename = nil)
      @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('::')
    end

    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} < ActiveRecord::Base; end"
      klass = Kernel.const_get(klass_name, true)
      klass.class_eval(&block) if block_given?
      klass.table_name = table_name
      klass
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
anonymous_active_record-1.0.3 lib/anonymous_active_record/generator.rb
anonymous_active_record-1.0.2 lib/anonymous_active_record/generator.rb
anonymous_active_record-1.0.1 lib/anonymous_active_record/generator.rb
anonymous_active_record-1.0.0 lib/anonymous_active_record/generator.rb
anonymous_active_record-0.1.4 lib/anonymous_active_record/generator.rb
anonymous_active_record-0.1.3 lib/anonymous_active_record/generator.rb
anonymous_active_record-0.1.2 lib/anonymous_active_record/generator.rb