module RubyEnum::ActiveRecord::AttrEnum::ClassMethods
Public Instance Methods
attr_enum(name, opts = {})
click to toggle source
# File lib/ruby_enum/active_record.rb, line 10 def attr_enum(name, opts = {}) _create_attr_descriptor_for(name, opts) _define_attr_getter_for name _define_attr_setter_for name end
attr_enums()
click to toggle source
# File lib/ruby_enum/active_record.rb, line 16 def attr_enums @_attr_enums ||= {} end
Private Instance Methods
_create_attr_descriptor_for(name, opts)
click to toggle source
# File lib/ruby_enum/active_record.rb, line 22 def _create_attr_descriptor_for(name, opts) if attr_enums[name].present? raise ArgumentError, "#{self} already has an enum attr named `#{name}`" end # set a default enumeration class name if none provided if opts[:class_name].nil? opts[:class_name] = _enum_class_name_for name end attr_enums[name] = opts end
_define_attr_getter_for(name)
click to toggle source
Calls superclass method
# File lib/ruby_enum/active_record.rb, line 39 def _define_attr_getter_for(name) define_method name do enum = self.class.attr_enums[name] enum_class = Object.const_get enum[:class_name] enum_class.find_by_value super() end def _define_attr_setter_for(name) define_method "#{name}=" do |new_value| if new_value.present? && !new_value.is_a?(RubyEnum) enum_class_name = self.class.attr_enums[name][:class_name] raise "You are trying to assign a `#{new_value.class.name}` value " \ "to enumeration attribute `#{name}` which is not supported. " \ "You must use `#{enum_class_name}` values instead." end super(new_value.try(:value)) end end end
_define_attr_setter_for(name)
click to toggle source
Calls superclass method
# File lib/ruby_enum/active_record.rb, line 46 def _define_attr_setter_for(name) define_method "#{name}=" do |new_value| if new_value.present? && !new_value.is_a?(RubyEnum) enum_class_name = self.class.attr_enums[name][:class_name] raise "You are trying to assign a `#{new_value.class.name}` value " \ "to enumeration attribute `#{name}` which is not supported. " \ "You must use `#{enum_class_name}` values instead." end super(new_value.try(:value)) end end
_enum_class_name_for(name)
click to toggle source
# File lib/ruby_enum/active_record.rb, line 35 def _enum_class_name_for(name) name.to_s.capitalize end