Module: ActiveRecord::Enum

Defined in:
lib/active_record/enum_override.rb,
lib/active_record/enum/enum_type.rb

Defined Under Namespace

Classes: EnumType

Instance Method Summary collapse

Instance Method Details

#database_nameObject



72
73
74
# File 'lib/active_record/enum_override.rb', line 72

def database_name
  ActiveRecord::Base.connection_config[:database]
end

#schema_values(name) ⇒ Object



68
69
70
# 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) ⇒ Object



76
77
78
79
80
81
82
83
84
# 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 = {}) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 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) ⇒ Object



64
65
66
# File 'lib/active_record/enum_override.rb', line 64

def values(name)
  schema_values(name).to_s.scan(/\w+/).reject{|v| v == 'enum'}
end