Module: DuckRecord::Enum

Included in:
Base
Defined in:
lib/duck_record/enum.rb

Defined Under Namespace

Classes: EnumType

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object

:nodoc:



7
8
9
10
# File 'lib/duck_record/enum.rb', line 7

def self.extended(base) # :nodoc:
  base.class_attribute(:defined_enums, instance_writer: false)
  base.defined_enums = {}
end

Instance Method Details

#enum(definitions) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/duck_record/enum.rb', line 58

def enum(definitions)
  klass = self
  enum_prefix = definitions.delete(:_prefix)
  enum_suffix = definitions.delete(:_suffix)
  definitions.each do |name, values|
    # statuses = { }
    enum_values = ActiveSupport::HashWithIndifferentAccess.new
    name        = name.to_sym

    # def self.statuses() statuses end
    detect_enum_conflict!(name, name.to_s.pluralize, true)
    klass.singleton_class.send(:define_method, name.to_s.pluralize) { enum_values }

    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_methods_module.module_eval do
      pairs = values.respond_to?(:each_pair) ? values.each_pair : values.each_with_index
      pairs.each do |value, i|
        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}"
        enum_values[value] = i

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

#inherited(base) ⇒ Object

:nodoc:



12
13
14
15
# File 'lib/duck_record/enum.rb', line 12

def inherited(base) # :nodoc:
  base.defined_enums = defined_enums.deep_dup
  super
end