Very naughty mega-commit. Added enum and validator specs. Everything seems to be working as expected

This commit is contained in:
Nicholas Bruning 2013-11-06 17:46:18 +11:00
parent d763fc9abf
commit 34eb6d02d1

View File

@ -1,7 +1,41 @@
require "mongoid/enum/version" require "mongoid/enum/version"
require "mongoid/enum/validators/multiple_validator"
module Mongoid module Mongoid
module Enum 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
end end