Sha256: 21cb4ffb768d8643d6eeb4877c046d003599bfa61cf71e30854350859865691c

Contents?: true

Size: 1.32 KB

Versions: 2

Compression:

Stored size: 1.32 KB

Contents

# frozen_string_literal: true

module ActiveRecordDataLoader
  module ActiveRecord
    class EnumValueGenerator
      class << self
        def generator_for(model_class:, ar_column:, connection_factory:)
          values = enum_values_for(model_class, ar_column.sql_type, connection_factory)
          -> { values.sample }
        end

        private

        def enum_values_for(model_class, enum_type, connection_factory)
          connection = connection_factory.call

          if connection.adapter_name.downcase.to_sym == :postgresql
            postgres_enum_values_for(model_class, enum_type)
          elsif connection.adapter_name.downcase.to_s.start_with?("mysql")
            mysql_enum_values_for(model_class, enum_type)
          else
            []
          end
        end

        def postgres_enum_values_for(model_class, enum_type)
          model_class
            .connection
            .execute("SELECT unnest(enum_range(NULL::#{enum_type}))::text")
            .map(&:values)
            .flatten
            .compact
        end

        def mysql_enum_values_for(_model_class, enum_type)
          enum_type
            .to_s
            .downcase
            .gsub(/\Aenum\(|\)\Z/, "")
            .split(",")
            .map(&:strip)
            .map { |s| s.gsub(/\A'|'\Z/, "") }
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
active_record_data_loader-1.1.0 lib/active_record_data_loader/active_record/enum_value_generator.rb
active_record_data_loader-1.0.2 lib/active_record_data_loader/active_record/enum_value_generator.rb