Module: MongoidEnumerable
- Defined in:
- lib/mongoid_enumerable.rb,
lib/mongoid_enumerable/version.rb
Constant Summary collapse
- VERSION =
"0.4.4"
Class Method Summary collapse
- .define_enumerable_method(model:, field_name:, values:, default:, prefix:, before_change:, after_change:) ⇒ Object
- .define_enumerable_methods(model) ⇒ Object
- .define_value_methods(model:, value:, field_name:, prefix:, before_change:, after_change:) ⇒ Object
- .included(model) ⇒ Object
Instance Method Summary collapse
- #run_callback(callback_method_name:, value_before:, value_after:) ⇒ Object
- #validate_callback_method(method:) ⇒ Object
Class Method Details
.define_enumerable_method(model:, field_name:, values:, default:, prefix:, before_change:, after_change:) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/mongoid_enumerable.rb', line 25 def self.define_enumerable_method(model:, field_name:, values:, default:, prefix:, before_change:, after_change:) model.field(field_name, type: String, default: default) values.each do |value| define_value_methods( model: model, value: value, field_name: field_name, prefix: prefix, before_change: before_change, after_change: after_change ) end model.define_singleton_method("all_#{field_name}") do values end end |
.define_enumerable_methods(model) ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/mongoid_enumerable.rb', line 11 def self.define_enumerable_methods(model) model.define_singleton_method :enumerable do |field_name, values, = {}| MongoidEnumerable.define_enumerable_method( model: model, field_name: String(field_name), values: values.collect(&:to_s), default: .fetch(:default, values.first), prefix: .fetch(:prefix, nil), before_change: [:before_change], after_change: [:after_change] ) end end |
.define_value_methods(model:, value:, field_name:, prefix:, before_change:, after_change:) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/mongoid_enumerable.rb', line 44 def self.define_value_methods(model:, value:, field_name:, prefix:, before_change:, after_change:) method_name = "#{prefix}#{value}" model.define_method("#{method_name}!") do value_before = send(field_name) value_after = value callback_result = run_callback(callback_method_name: before_change, value_before: value_before, value_after: value_after) if callback_result update!(field_name => value) run_callback(callback_method_name: after_change, value_before: value_before, value_after: value_after) end end model.define_method("#{method_name}?") do send(field_name) == value end model.scope method_name, -> { where(field_name => value) } end |
.included(model) ⇒ Object
7 8 9 |
# File 'lib/mongoid_enumerable.rb', line 7 def self.included(model) define_enumerable_methods(model) end |
Instance Method Details
#run_callback(callback_method_name:, value_before:, value_after:) ⇒ Object
68 69 70 71 72 73 74 75 76 77 |
# File 'lib/mongoid_enumerable.rb', line 68 def run_callback(callback_method_name:, value_before:, value_after:) if callback_method_name callback_method = method(callback_method_name) validate_callback_method(method: callback_method) callback_method.call(value_before, value_after) else true end end |
#validate_callback_method(method:) ⇒ Object
79 80 81 82 83 |
# File 'lib/mongoid_enumerable.rb', line 79 def validate_callback_method(method:) return if method.arity == 2 || method.arity.negative? raise "Method #{method.name} must receive two parameters: old_value and new_value" end |