Module: Trax::Model::Enum::ClassMethods

Defined in:
lib/trax/model/enum.rb

Instance Method Summary collapse

Instance Method Details

#as_enum(enum_name, enum_mapping, options = {}) ⇒ Object

todo: ew need to clean this up



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/trax/model/enum.rb', line 41

def as_enum(enum_name, enum_mapping, options = {})
  enum_values = enum_mapping.is_a?(Hash) ? enum_mapping.keys : enum_mapping
  options.assert_valid_keys(:prefix, :source, :message, :default, :validate)

  options[:message] ||= "Invalid value selected for #{enum_name}"
  options[:prefix] ||= true
  options[:source] ||= enum_name
  default_value = options.extract!(:default)[:default] if options.key?(:default)

  validation_options = { :in => enum_values, :message => options.extract!(:message)[:message] }

  self.validates_inclusion_of(enum_name, validation_options) unless options.key?(:validate) && !options[:validate]
  
  options.delete(:validate) if options.key?(:validate)

  define_scopes_for_trax_enum(enum_name)

  super(enum_name, enum_mapping, options)
  self.default_value_for(enum_name) { default_value } if default_value
end

#define_scopes_for_trax_enum(enum_name) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/trax/model/enum.rb', line 26

def define_scopes_for_trax_enum(enum_name)
  scope_method_name = :"by_#{enum_name}"
  scope_not_method_name = :"by_#{enum_name}_not"

  self.scope scope_method_name, lambda { |*values|
    enum_hash = self.__send__("#{enum_name}".pluralize).hash
    where(enum_name => enum_hash.with_indifferent_access.slice(*values.flatten.compact.uniq).values)
  }
  self.scope scope_not_method_name, lambda { |*values|
    enum_hash = self.__send__("#{enum_name}".pluralize).hash
    where.not(enum_name => enum_hash.with_indifferent_access.slice(*values.flatten.compact.uniq).values)
  }
end