@@ -5,38 +5,69 @@ module Mongoid
5
5
module Enum
6
6
extend ActiveSupport ::Concern
7
7
module ClassMethods
8
+
8
9
def enum ( name , values , options = { } )
9
10
field_name = :"_#{ name } "
10
- const_name = name . to_s . upcase
11
- multiple = options [ :multiple ] || false
12
- default = options [ :default ] . nil? && values . first || options [ :default ]
13
- required = options [ :required ] . nil? || options [ :required ]
14
- validate = options [ :validate ] . nil? || options [ :validate ]
11
+ options = default_options ( values ) . merge ( options )
15
12
16
- const_set const_name , values
13
+ set_values_constant name , values
17
14
18
- type = multiple && Array || Symbol
19
- field field_name , :type => type , :default => default
15
+ create_field field_name , options
20
16
alias_attribute name , field_name
21
17
22
- if multiple && validate
23
- validates field_name , :'mongoid/enum/validators/multiple' => { :in => values , :allow_nil => !required }
18
+ create_validations field_name , values , options
19
+ define_value_scopes_and_accessors field_name , values , options
20
+ end
21
+
22
+ private
23
+ def default_options ( values )
24
+ {
25
+ :multiple => false ,
26
+ :default => values . first ,
27
+ :required => true ,
28
+ :validate => true
29
+ }
30
+ end
31
+
32
+ def set_values_constant ( name , values )
33
+ const_name = name . to_s . upcase
34
+ const_set const_name , values
35
+ end
36
+
37
+ def create_field ( field_name , options )
38
+ type = options [ :multiple ] && Array || Symbol
39
+ field field_name , :type => type , :default => options [ :default ]
40
+ end
41
+
42
+ def create_validations ( field_name , values , options )
43
+ if options [ :multiple ] && options [ :validate ]
44
+ validates field_name , :'mongoid/enum/validators/multiple' => { :in => values , :allow_nil => !options [ :required ] }
24
45
elsif validate
25
- validates field_name , :inclusion => { :in => values } , :allow_nil => !required
46
+ validates field_name , :inclusion => { :in => values } , :allow_nil => !options [ : required]
26
47
end
48
+ end
27
49
50
+ def define_value_scopes_and_accessors ( field_name , values , options )
28
51
values . each do |value |
29
52
scope value , -> { where ( field_name => value ) }
30
53
31
- if multiple
32
- class_eval "def #{ value } ?() self.#{ field_name } .include?(:#{ value } ) end"
33
- class_eval "def #{ value } !() update_attributes! :#{ field_name } => (self.#{ field_name } || []) + [:#{ value } ] end"
54
+ if options [ :multiple ]
55
+ define_array_accessor ( field_name , value )
34
56
else
35
- class_eval "def #{ value } ?() self.#{ field_name } == :#{ value } end"
36
- class_eval "def #{ value } !() update_attributes! :#{ field_name } => :#{ value } end"
57
+ define_string_accessor ( field_name , value )
37
58
end
38
59
end
39
60
end
61
+
62
+ def define_array_accessor ( field_name , value )
63
+ class_eval "def #{ value } ?() self.#{ field_name } .include?(:#{ value } ) end"
64
+ class_eval "def #{ value } !() update_attributes! :#{ field_name } => (self.#{ field_name } || []) + [:#{ value } ] end"
65
+ end
66
+
67
+ def define_string_accessor ( field_name , value )
68
+ class_eval "def #{ value } ?() self.#{ field_name } == :#{ value } end"
69
+ class_eval "def #{ value } !() update_attributes! :#{ field_name } => :#{ value } end"
70
+ end
40
71
end
41
72
end
42
73
end
0 commit comments