module PersistentEnum::ActsAsEnum::ClassMethods

Public Instance Methods

[](index) click to toggle source
# File lib/persistent_enum/acts_as_enum.rb, line 116
def [](index)
  _acts_as_enum_state.by_ordinal[index]
end
_acts_as_enum_state() click to toggle source

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

# File lib/persistent_enum/acts_as_enum.rb, line 52
def _acts_as_enum_state
  nil
end
active?(member) click to toggle source
# 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_ordinals() click to toggle source

All ordinals, including of inactive enum members

# File lib/persistent_enum/acts_as_enum.rb, line 156
def all_ordinals
  _acts_as_enum_state.by_ordinal.keys
end
all_values() click to toggle source

All enum members, including inactive

# File lib/persistent_enum/acts_as_enum.rb, line 161
def all_values
  _acts_as_enum_state.by_ordinal.values
end
dummy_class() click to toggle source
# 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) click to toggle source
# 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_attr() click to toggle source
# File lib/persistent_enum/acts_as_enum.rb, line 165
def name_attr
  _acts_as_enum_state.name_attr
end
ordinals() click to toggle source

Currently active ordinals

# File lib/persistent_enum/acts_as_enum.rb, line 142
def ordinals
  _acts_as_enum_state.required_by_ordinal.keys
end
reinitialize_acts_as_enum() click to toggle source
# 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) click to toggle source
# 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
Also aliased as: with_name
value_of!(name, insensitive: false) click to toggle source
# 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
values() click to toggle source

Currently active enum members

# File lib/persistent_enum/acts_as_enum.rb, line 147
def values
  _acts_as_enum_state.required_by_ordinal.values
end
with_name(name, insensitive: false)
Alias for: value_of