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