module Mongoid::Enum::Dazzl::ClassMethods
Public Instance Methods
enum(name, values, options = {})
click to toggle source
# File lib/mongoid/enum/dazzl.rb, line 12 def enum(name, values, options = {}) field_name = \ :"#{Mongoid::Enum::Dazzl.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/dazzl.rb, line 42 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/dazzl.rb, line 47 def create_validations(field_name, values, options) if options[:multiple] && options[:validate] validates field_name, 'mongoid/enum/dazzl/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/dazzl.rb, line 28 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/dazzl.rb, line 109 def define_array_accessor(field_name, value) class_eval <<-EOT, __FILE__, __LINE__ + 1 def #{value}?() self.#{field_name}.include?(:#{value}) end def #{value}!() update_attributes! \ :#{field_name} => (self.#{field_name} || []) + [:#{value}] end EOT end
define_array_field_accessor(name, field_name)
click to toggle source
# File lib/mongoid/enum/dazzl.rb, line 83 def define_array_field_accessor(name, field_name) class_eval <<-EOT, __FILE__, __LINE__ + 1 def #{name}=(vals) self.write_attribute(:#{field_name}, Array(vals).compact.map(&:to_sym)) end def #{name}() self.read_attribute(:#{field_name}) end EOT end
define_field_accessor(name, field_name, options)
click to toggle source
# File lib/mongoid/enum/dazzl.rb, line 75 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/dazzl.rb, line 122 def define_string_accessor(field_name, value) class_eval <<-EOT, __FILE__, __LINE__ + 1 def #{value}?() self.#{field_name} == :#{value} end def #{value}!() update_attributes! :#{field_name} => :#{value} end EOT end
define_string_field_accessor(name, field_name)
click to toggle source
# File lib/mongoid/enum/dazzl.rb, line 96 def define_string_field_accessor(name, field_name) class_eval <<-EOT, __FILE__, __LINE__ + 1 def #{name}=(val) self.write_attribute(:#{field_name}, val && val.to_sym || nil) end def #{name}() self.read_attribute(:#{field_name}) end EOT end
define_value_scopes_and_accessors(field_name, values, options)
click to toggle source
# File lib/mongoid/enum/dazzl.rb, line 63 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/dazzl.rb, line 37 def set_values_constant(name, values) const_name = name.to_s.upcase const_set const_name, values end