module ActiveRecord::Enum

Public Instance Methods

database_name() click to toggle source
# File lib/active_record/enum_override.rb, line 72
def database_name
  ActiveRecord::Base.connection_config[:database]
end
schema_values(name) click to toggle source
# File lib/active_record/enum_override.rb, line 68
def schema_values(name)
  ActiveRecord::Base.connection.exec_query(schema_values_query(name)).rows.dig(0,0)
end
schema_values_query(name) click to toggle source
# File lib/active_record/enum_override.rb, line 76
def schema_values_query(name)
  %{
    SELECT column_type
    FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = '#{database_name}'
    AND TABLE_NAME = '#{table_name}'
    AND COLUMN_NAME = '#{name}'
  }
end
sql_enum(name, options={}) click to toggle source
# File lib/active_record/enum_override.rb, line 5
def sql_enum(name, options={})
  enum_prefix = options.delete(:_prefix)
  enum_suffix = options.delete(:_suffix)

  enum_prefix ||= name if SqlEnum.configuration&.default_prefix
  enum_suffix ||= name if SqlEnum.configuration&.default_suffix

  klass       = self
  enum_values = Array.new
  name        = name.to_sym

  detect_enum_conflict!(name, name.to_s.pluralize, true)
  klass.singleton_class.send(:define_method, name.to_s.pluralize) { enum_values.map(&:to_sym) }

  detect_enum_conflict!(name, name)
  detect_enum_conflict!(name, "#{name}=")

  attr = attribute_alias?(name) ? attribute_alias(name) : name

  if Rails.version >= '6.1'
    decorate_attribute_type(name) do |subtype|
      EnumType.new(attr, enum_values, subtype)
    end
  else
    decorate_attribute_type(attr, :enum) do |subtype|
      EnumType.new(attr, enum_values, subtype)
    end
  end

  enum_values = values(name)
  enum_values.each do |value|
    if enum_prefix == true
      prefix = "#{name}_"
    elsif enum_prefix
      prefix = "#{enum_prefix}_"
    end
    if enum_suffix == true
      suffix = "_#{name}"
    elsif enum_suffix
      suffix = "_#{enum_suffix}"
    end

    value_method_name = "#{prefix}#{value}#{suffix}"

    # def active?() status == 0 end
    klass.send(:detect_enum_conflict!, name, "#{value_method_name}?")
    define_method("#{value_method_name}?") { self[attr] == value.to_sym }

    # def active!() update! status: :active end
    klass.send(:detect_enum_conflict!, name, "#{value_method_name}!")
    define_method("#{value_method_name}!") { update!(attr => value) }

    # scope :active, -> { where status: 0 }
    klass.send(:detect_enum_conflict!, name, value_method_name, true)
    klass.scope value_method_name, -> { where(attr => value) }
  end
  defined_enums[name.to_s] = enum_values
end
values(name) click to toggle source
# File lib/active_record/enum_override.rb, line 64
def values(name)
  schema_values(name).to_s.scan(/\w+/).reject{|v| v == 'enum'}
end