module Mongoid::Enum::ClassMethods

Public Instance Methods

enum(name, values, options = {}) click to toggle source
# File lib/mongoid/enum.rb, line 10
def enum(name, values, options = {})
  field_name = :"#{Mongoid::Enum.configuration.field_name_prefix}#{name}"
  options = default_options(values).merge(options)

  set_values_constant name, values

  create_field field_name, options

  create_validations field_name, values, options
  define_value_scopes_and_accessors field_name, values, options
  define_field_accessor name, field_name, options
end

Private Instance Methods

create_field(field_name, options) click to toggle source
# File lib/mongoid/enum.rb, line 38
def create_field(field_name, options)
  type = options[:multiple] && Array || Symbol
  field field_name, :type => type, :default => options[:default]
end
create_validations(field_name, values, options) click to toggle source
# File lib/mongoid/enum.rb, line 43
def create_validations(field_name, values, options)
  if options[:multiple] && options[:validate]
    validates field_name, :'mongoid/enum/validators/multiple' => { :in => values.map(&:to_sym), :allow_nil => !options[:required] }
  #FIXME: Shouldn't this be `elsif options[:validate]` ???
  elsif validate
    validates field_name, :inclusion => {:in => values.map(&:to_sym)}, :allow_nil => !options[:required]
  end
end
default_options(values) click to toggle source
# File lib/mongoid/enum.rb, line 24
def default_options(values)
  {
    :multiple => false,
    :default  => values.first,
    :required => true,
    :validate => true
  }
end
define_array_accessor(field_name, value) click to toggle source
# File lib/mongoid/enum.rb, line 82
def define_array_accessor(field_name, value)
  class_eval "def #{value}?() self.#{field_name}.include?(:#{value}) end"
  class_eval "def #{value}!() update_attributes! :#{field_name} => (self.#{field_name} || []) + [:#{value}] end"
end
define_array_field_accessor(name, field_name) click to toggle source
# File lib/mongoid/enum.rb, line 72
def define_array_field_accessor(name, field_name)
  class_eval "def #{name}=(vals) self.write_attribute(:#{field_name}, Array(vals).compact.map(&:to_sym)) end"
  class_eval "def #{name}() self.read_attribute(:#{field_name}) end"
end
define_field_accessor(name, field_name, options) click to toggle source
# File lib/mongoid/enum.rb, line 64
def define_field_accessor(name, field_name, options)
  if options[:multiple]
    define_array_field_accessor name, field_name
  else
    define_string_field_accessor name, field_name
  end
end
define_string_accessor(field_name, value) click to toggle source
# File lib/mongoid/enum.rb, line 87
def define_string_accessor(field_name, value)
  class_eval "def #{value}?() self.#{field_name} == :#{value} end"
  class_eval "def #{value}!() update_attributes! :#{field_name} => :#{value} end"
end
define_string_field_accessor(name, field_name) click to toggle source
# File lib/mongoid/enum.rb, line 77
def define_string_field_accessor(name, field_name)
  class_eval "def #{name}=(val) self.write_attribute(:#{field_name}, val && val.to_sym || nil) end"
  class_eval "def #{name}() self.read_attribute(:#{field_name}) end"
end
define_value_scopes_and_accessors(field_name, values, options) click to toggle source
# File lib/mongoid/enum.rb, line 52
def define_value_scopes_and_accessors(field_name, values, options)
  values.each do |value|
    scope value, ->{ where(field_name => value) }

    if options[:multiple]
      define_array_accessor(field_name, value)
    else
      define_string_accessor(field_name, value)
    end
  end
end
set_values_constant(name, values) click to toggle source
# File lib/mongoid/enum.rb, line 33
def set_values_constant(name, values)
  const_name = name.to_s.upcase
  const_set const_name, values
end