diff --git a/lib/mongoid/enum.rb b/lib/mongoid/enum.rb index 589751a..9ac4ddf 100644 --- a/lib/mongoid/enum.rb +++ b/lib/mongoid/enum.rb @@ -1,7 +1,41 @@ require "mongoid/enum/version" +require "mongoid/enum/validators/multiple_validator" module Mongoid module Enum - # Your code goes here... + extend ActiveSupport::Concern + module ClassMethods + 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] + + const_set const_name, values + + type = multiple && Array || Symbol + field field_name, :type => type, :default => default + alias_attribute name, field_name + + if multiple + validates field_name, :'mongoid/enum/validators/multiple' => { :in => values, :allow_nil => !required } + else + 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 + end end end