Module: Mongoid::Enum::ClassMethods

Defined in:
lib/mongoid/enum.rb

Instance Method Summary collapse

Instance Method Details

#enum(name, values, options = {}) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/mongoid/enum.rb', line 8

def enum(name, values, options = {})
  field_name = :"_#{name}"
  const_name = name.to_s.upcase
  multiple = options[:multiple] || false
  default = options[:default].nil? && values.first || options[:default]
  required = options[:required].nil? || options[:required]
  validate = options[:validate].nil? || options[:validate]

  const_set const_name, values

  type = multiple && Array || Symbol
  field field_name, :type => type, :default => default
  alias_attribute name, field_name

  if multiple && validate
    validates field_name, :'mongoid/enum/validators/multiple' => { :in => values, :allow_nil => !required }
  elsif validate
    validates field_name, :inclusion => {:in => values}, :allow_nil => !required
  end

  values.each do |value|
    scope value, where(field_name => value)

    if multiple
      class_eval "def #{value}?() self.#{field_name}.include?(:#{value}) end"
      class_eval "def #{value}!() update_attributes! :#{field_name} => (self.#{field_name} || []) + [:#{value}] end"
    else
      class_eval "def #{value}?() self.#{field_name} == :#{value} end"
      class_eval "def #{value}!() update_attributes! :#{field_name} => :#{value} end"
    end
  end
end