class Enumerize::Attribute

Attributes

default_value[R]
name[R]
values[R]

Public Class Methods

new(klass, name, options={}) click to toggle source
# File lib/enumerize/attribute.rb, line 5
def initialize(klass, name, options={})
  raise ArgumentError, ':in option is required' unless options[:in]

  extend Multiple if options[:multiple]

  @klass  = klass
  @name   = name.to_sym
  @values = Array(options[:in]).map { |v| Value.new(self, *v) }
  @value_hash = Hash[@values.map { |v| [v.value.to_s, v] }]
  @value_hash.merge! Hash[@values.map { |v| [v.to_s, v] }]

  if options[:default]
    @default_value = find_value(options[:default])
    raise ArgumentError, 'invalid default value' unless @default_value
  end
end

Public Instance Methods

define_methods!(mod) click to toggle source
# File lib/enumerize/attribute.rb, line 51
    def define_methods!(mod)
      mod.module_eval "        def #{name}
          if defined?(super)
            self.class.enumerized_attributes[:#{name}].find_value(super)
          elsif respond_to?(:read_attribute)
            self.class.enumerized_attributes[:#{name}].find_value(read_attribute(:#{name}))
          else
            if defined?(@#{name})
              self.class.enumerized_attributes[:#{name}].find_value(@#{name})
            else
              @#{name} = nil
            end
          end
        end

        def #{name}=(new_value)
          _enumerized_values_for_validation[:#{name}] = new_value.nil? ? nil : new_value.to_s

          allowed_value_or_nil = self.class.enumerized_attributes[:#{name}].find_value(new_value)
          allowed_value_or_nil = allowed_value_or_nil.value unless allowed_value_or_nil.nil?

          if defined?(super)
            super allowed_value_or_nil
          elsif respond_to?(:write_attribute, true)
            write_attribute '#{name}', allowed_value_or_nil
          else
            @#{name} = allowed_value_or_nil
          end
        end

        def #{name}_text
          self.#{name} && self.#{name}.text
        end
", __FILE__, __LINE__ + 1
    end
find_value(value) click to toggle source
# File lib/enumerize/attribute.rb, line 22
def find_value(value)
  @value_hash[value.to_s] unless value.nil?
end
i18n_suffix() click to toggle source
# File lib/enumerize/attribute.rb, line 26
def i18n_suffix
  @klass.model_name.i18n_key if @klass.respond_to?(:model_name)
end
options(options = {}) click to toggle source
# File lib/enumerize/attribute.rb, line 30
def options(options = {})
  values = if options.empty?
    @values
  else
    raise ArgumentError, 'Options cannot have both :only and :except' if options[:only] && options[:except]

    only = Array(options[:only]).map(&:to_s)
    except = Array(options[:except]).map(&:to_s)

    @values.reject do |value|
      if options[:only]
        !only.include?(value)
      elsif options[:except]
        except.include?(value)
      end
    end
  end

  values.map { |v| [v.text, v.to_s] }
end