Merge pull request #5 from thetron/update/cleanup
Quest for the 4.0 GPA
This commit is contained in:
commit
8b5b23bb45
@ -1,14 +1,15 @@
|
||||
script: "bundle exec rspec spec"
|
||||
|
||||
language: ruby
|
||||
|
||||
rvm:
|
||||
- 1.9.3
|
||||
- 2.0.0
|
||||
- 2.1.1
|
||||
- jruby-19mode
|
||||
- rbx-19mode
|
||||
|
||||
gemfile:
|
||||
- Gemfile
|
||||
notifications:
|
||||
recipients:
|
||||
- nicholas@bruning.com.au
|
||||
|
||||
services:
|
||||
- mongodb
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
[](https://travis-ci.org/thetron/mongoid-enum)
|
||||
[](https://codeclimate.com/github/thetron/mongoid-enum)
|
||||
|
||||
Heavily inspired by [DHH's
|
||||
ActiveRecord::Enum](https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5), this little library is
|
||||
|
@ -5,38 +5,69 @@ 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
|
||||
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]
|
||||
define_array_accessor(field_name, value)
|
||||
else
|
||||
define_string_accessor(field_name, value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def define_array_accessor(field_name, value)
|
||||
class_eval "def #{value}?() self.#{field_name}.include?(:#{value}) end"
|
||||
class_eval "def #{value}!() update_attributes! :#{field_name} => (self.#{field_name} || []) + [:#{value}] end"
|
||||
else
|
||||
end
|
||||
|
||||
def define_string_accessor(field_name, value)
|
||||
class_eval "def #{value}?() self.#{field_name} == :#{value} end"
|
||||
class_eval "def #{value}!() update_attributes! :#{field_name} => :#{value} end"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user