Skip to content
This repository was archived by the owner on May 16, 2022. It is now read-only.

Commit a0892df

Browse files
committed
Merged plainprogrammer-feature-mongoid4
2 parents a0ebd46 + 3fda46a commit a0892df

File tree

3 files changed

+60
-18
lines changed

3 files changed

+60
-18
lines changed

.travis.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
script: "bundle exec rspec spec"
2+
23
language: ruby
4+
35
rvm:
46
- 1.9.3
57
- 2.0.0

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
[![Build
44
Status](https://travis-ci.org/thetron/mongoid-enum.png)](https://travis-ci.org/thetron/mongoid-enum)
5+
[![Code Climate](https://codeclimate.com/github/thetron/mongoid-enum.png)](https://codeclimate.com/github/thetron/mongoid-enum)
56

67
Heavily inspired by [DHH's
78
ActiveRecord::Enum](https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5), this little library is
@@ -126,7 +127,7 @@ Sometimes you'll need to store multiple values from your list, this
126127
couldn't be easier:
127128

128129
```ruby
129-
enum, :roles => [:basic, :manager, :administrator], :multiple => true
130+
enum :roles, [:basic, :manager, :administrator], :multiple => true
130131

131132
# ...
132133

@@ -140,6 +141,14 @@ user.administrator? # => false
140141
user.roles # => [:basic, :manager]
141142
```
142143

144+
Since the underlying datatype for storing values is an array, if you
145+
need to specify default(s), ensure you use an array:
146+
147+
```ruby
148+
enum :roles, [:noob, :author, :editor], :multiple => true, :default => [:author, :editor] # two defaults
149+
enum :roles, [:noob, :author, :editor], :multiple => true, :default => [] # no default
150+
```
151+
143152
## Validations
144153

145154
Validations are baked in by default, and ensure that the value(s) set in
@@ -148,7 +157,7 @@ complex validations, or you just want to throw caution to the wind, you
148157
can turn them off:
149158

150159
```ruby
151-
enum :status => [:up, :down], :validate => false
160+
enum :status, [:up, :down], :validate => false
152161
```
153162

154163
# Issues and Feature Requests

lib/mongoid/enum.rb

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,69 @@ module Mongoid
55
module Enum
66
extend ActiveSupport::Concern
77
module ClassMethods
8+
89
def enum(name, values, options = {})
910
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)
1512

16-
const_set const_name, values
13+
set_values_constant name, values
1714

18-
type = multiple && Array || Symbol
19-
field field_name, :type => type, :default => default
15+
create_field field_name, options
2016
alias_attribute name, field_name
2117

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] }
2445
elsif validate
25-
validates field_name, :inclusion => {:in => values}, :allow_nil => !required
46+
validates field_name, :inclusion => {:in => values}, :allow_nil => !options[:required]
2647
end
48+
end
2749

50+
def define_value_scopes_and_accessors(field_name, values, options)
2851
values.each do |value|
2952
scope value, ->{ where(field_name => value) }
3053

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)
3456
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)
3758
end
3859
end
3960
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
4071
end
4172
end
4273
end

0 commit comments

Comments
 (0)