Module: PersistentEnum::ActsAsEnum::ClassMethods

Defined in:
lib/persistent_enum/acts_as_enum.rb

Instance Method Summary collapse

Instance Method Details

#[](index) ⇒ Object



116
117
118
# File 'lib/persistent_enum/acts_as_enum.rb', line 116

def [](index)
  _acts_as_enum_state.by_ordinal[index]
end

#_acts_as_enum_stateObject

Overridden in singleton classes to close over acts-as-enum state in an subclassing-safe way.



52
53
54
# File 'lib/persistent_enum/acts_as_enum.rb', line 52

def _acts_as_enum_state
  nil
end

#active?(member) ⇒ Boolean

Returns:

  • (Boolean)


151
152
153
# File 'lib/persistent_enum/acts_as_enum.rb', line 151

def active?(member)
  _acts_as_enum_state.required_by_ordinal.has_key?(member.ordinal)
end

#all_ordinalsObject

All ordinals, including of inactive enum members



156
157
158
# File 'lib/persistent_enum/acts_as_enum.rb', line 156

def all_ordinals
  _acts_as_enum_state.by_ordinal.keys
end

#all_valuesObject

All enum members, including inactive



161
162
163
# File 'lib/persistent_enum/acts_as_enum.rb', line 161

def all_values
  _acts_as_enum_state.by_ordinal.values
end

#dummy_classObject



112
113
114
# File 'lib/persistent_enum/acts_as_enum.rb', line 112

def dummy_class
  PersistentEnum.dummy_class(self, name_attr)
end

#initialize_acts_as_enum(enum_spec) ⇒ Object



56
57
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/persistent_enum/acts_as_enum.rb', line 56

def initialize_acts_as_enum(enum_spec)
  prev_state = _acts_as_enum_state

  if self.methods(false).include?(:_acts_as_enum_state)
    singleton_class.class_eval do
      remove_method(:_acts_as_enum_state)
    end
  end

  ActsAsEnum.register_acts_as_enum(self) if prev_state.nil?

  required_values = PersistentEnum.cache_constants(
    self,
    enum_spec.required_members,
    name_attr:     enum_spec.name_attr,
    sql_enum_type: enum_spec.sql_enum_type)

  required_enum_constants = required_values.map { |val| val.read_attribute(enum_spec.name_attr) }

  # Now we've ensured that our required constants are present, load the rest
  # of the enum from the database (if present)
  all_values = required_values.dup
  begin
    if table_exists?
      all_values.concat(unscoped { where.not(id: required_values) })
    end
  rescue ActiveRecord::NoDatabaseError
    # Nothing additional to cache.
  end

  # Normalize values: If we already have a equal value in the previous
  # state, we want to use that rather than a new copy of it
  all_values.map! do |value|
    if prev_state.present? && (prev_value = prev_state.by_name[name]) == value
      prev_value
    else
      value
    end
  end

  state = State.new(enum_spec, all_values, required_enum_constants)

  singleton_class.class_eval do
    define_method(:_acts_as_enum_state) { state }
  end

  before_destroy { raise ActiveRecord::ReadOnlyRecord }
end

#name_attrObject



165
166
167
# File 'lib/persistent_enum/acts_as_enum.rb', line 165

def name_attr
  _acts_as_enum_state.name_attr
end

#ordinalsObject

Currently active ordinals



142
143
144
# File 'lib/persistent_enum/acts_as_enum.rb', line 142

def ordinals
  _acts_as_enum_state.required_by_ordinal.keys
end

#reinitialize_acts_as_enumObject



105
106
107
108
109
110
# File 'lib/persistent_enum/acts_as_enum.rb', line 105

def reinitialize_acts_as_enum
  current_state = _acts_as_enum_state
  raise "Cannot refresh acts_as_enum type #{self.name}: not already initialized!" if current_state.nil?

  initialize_acts_as_enum(current_state.enum_spec)
end

#value_of(name, insensitive: false) ⇒ Object Also known as: with_name



120
121
122
123
124
125
126
127
128
129
130
# File 'lib/persistent_enum/acts_as_enum.rb', line 120

def value_of(name, insensitive: false)
  if insensitive
    unless _acts_as_enum_state.insensitive_lookup?
      raise RuntimeError.new("#{self.name} constants are case-dependent: cannot perform case-insensitive lookup")
    end

    _acts_as_enum_state.by_name_insensitive[name.downcase]
  else
    _acts_as_enum_state.by_name[name]
  end
end

#value_of!(name, insensitive: false) ⇒ Object

Raises:

  • (NameError)


132
133
134
135
136
137
# File 'lib/persistent_enum/acts_as_enum.rb', line 132

def value_of!(name, insensitive: false)
  v = value_of(name, insensitive: insensitive)
  raise NameError.new("#{self}: Invalid member '#{name}'") unless v.present?

  v
end

#valuesObject

Currently active enum members



147
148
149
# File 'lib/persistent_enum/acts_as_enum.rb', line 147

def values
  _acts_as_enum_state.required_by_ordinal.values
end