module StoreModel::Enum
Allows defining Rails-like enums
Public Instance Methods
enum(name, values = nil, **kwargs)
click to toggle source
Defines new enum
@param name [String] name of the enum to define @param values [Object] @param kwargs [Object]
# File lib/store_model/enum.rb, line 11 def enum(name, values = nil, **kwargs) values ||= kwargs[:in] || kwargs ensure_hash(values).tap do |mapping| define_attribute(name, mapping, kwargs[:default]) define_reader(name, mapping) define_writer(name, mapping) define_method("#{name}_value") { attributes[name.to_s] } define_method("#{name}_values") { mapping } define_predicate_methods(name, mapping) end end
Private Instance Methods
cast_type(mapping)
click to toggle source
# File lib/store_model/enum.rb, line 45 def cast_type(mapping) StoreModel::Types::EnumType.new(mapping) end
define_attribute(name, mapping, default)
click to toggle source
# File lib/store_model/enum.rb, line 26 def define_attribute(name, mapping, default) attribute name, cast_type(mapping), default: default end
define_predicate_methods(name, mapping)
click to toggle source
# File lib/store_model/enum.rb, line 39 def define_predicate_methods(name, mapping) mapping.each do |label, value| define_method("#{label}?") { send(name) == mapping.key(value).to_s } end end
define_reader(name, mapping)
click to toggle source
# File lib/store_model/enum.rb, line 30 def define_reader(name, mapping) define_method(name) { mapping.key(send("#{name}_value")).to_s } end
define_writer(name, mapping)
click to toggle source
Calls superclass method
# File lib/store_model/enum.rb, line 34 def define_writer(name, mapping) type = cast_type(mapping) define_method("#{name}=") { |value| super type.cast_value(value) } end
ensure_hash(values)
click to toggle source
# File lib/store_model/enum.rb, line 49 def ensure_hash(values) return values if values.is_a?(Hash) values.zip(0...values.size).to_h end