From d4280d3eca597aed1756f904cad3952d4f730e35 Mon Sep 17 00:00:00 2001 From: Nicholas Bruning Date: Mon, 17 Mar 2014 23:35:39 +1100 Subject: [PATCH] Refactored Mongoid::Enum::ClassMethods for readability --- lib/mongoid/enum.rb | 51 ++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/lib/mongoid/enum.rb b/lib/mongoid/enum.rb index bf9117a..e58b002 100644 --- a/lib/mongoid/enum.rb +++ b/lib/mongoid/enum.rb @@ -5,30 +5,53 @@ module Mongoid module Enum 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] - validate = options[:validate].nil? || options[:validate] + options = default_options(values).merge(options) - const_set const_name, values + set_values_constant name, values - type = multiple && Array || Symbol - field field_name, :type => type, :default => default + create_field field_name, options 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 + create_validations field_name, values, options + define_value_scopes_and_accessors field_name, values, options + end + private + def default_options(values) + { + :multiple => false, + :default => values.first, + :required => true, + :validate => true + } + end + + def set_values_constant(name, values) + const_name = name.to_s.upcase + const_set const_name, values + end + + def create_field(field_name, options) + type = options[:multiple] && Array || Symbol + field field_name, :type => type, :default => options[:default] + end + + def create_validations(field_name, values, options) + if options[:multiple] && options[:validate] + validates field_name, :'mongoid/enum/validators/multiple' => { :in => values, :allow_nil => !options[:required] } + elsif validate + validates field_name, :inclusion => {:in => values}, :allow_nil => !options[:required] + end + end + + def define_value_scopes_and_accessors(field_name, values, options) values.each do |value| scope value, where(field_name => value) - if multiple + if options[: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