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

#schema_values(name) ⇒ Object



61
62
63
# File 'lib/active_record/enum_override.rb', line 61

def schema_values(name)
  ActiveRecord::Base.connection.exec_query(schema_values_query(name)).rows.dig(0,0)
end

#schema_values_query(name) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/active_record/enum_override.rb', line 65

def schema_values_query(name)
  %{
    SELECT column_type
    FROM information_schema.COLUMNS
    WHERE TABLE_NAME = '#{self.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
# 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
  decorate_attribute_type(attr, :enum) do |subtype|
    EnumType.new(attr, enum_values, subtype)
  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_s }

    # 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



57
58
59
# File 'lib/active_record/enum_override.rb', line 57

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