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