Module: Mongoid::Attributes::Dynamic
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/mongoid/attributes/dynamic.rb
Overview
This module contains the behavior for dynamic attributes.
Instance Method Summary collapse
-
#define_dynamic_before_type_cast_reader(name) ⇒ Object
private
Define a reader method for a dynamic attribute before type cast.
-
#define_dynamic_reader(name) ⇒ Object
private
Define a reader method for a dynamic attribute.
-
#define_dynamic_writer(name) ⇒ Object
private
Define a writer method for a dynamic attribute.
-
#inspect_dynamic_fields ⇒ String
Get an array of inspected dynamic fields for the document.
-
#method_missing(name, *args) ⇒ Object
private
Used for allowing accessor methods for dynamic attributes.
-
#process_attribute(name, value) ⇒ Object
If the attribute is dynamic, add a field for it with a type of object and set the value.
-
#respond_to?(name, include_private = false) ⇒ true, false
Override respond_to? so it responds properly for dynamic attributes.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Used for allowing accessor methods for dynamic attributes.
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/mongoid/attributes/dynamic.rb', line 136 def method_missing(name, *args) attr = name.to_s return super unless attributes.has_key?(attr.reader) if attr.writer? getter = attr.reader define_dynamic_writer(getter) write_attribute(getter, args.first) elsif attr.before_type_cast? define_dynamic_before_type_cast_reader(attr.reader) attribute_will_change!(attr.reader) read_attribute_before_type_cast(attr.reader) else getter = attr.reader define_dynamic_reader(getter) attribute_will_change!(attr.reader) read_raw_attribute(getter) end end |
Instance Method Details
#define_dynamic_before_type_cast_reader(name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Define a reader method for a dynamic attribute before type cast.
60 61 62 63 64 65 66 67 |
# File 'lib/mongoid/attributes/dynamic.rb', line 60 def define_dynamic_before_type_cast_reader(name) class_eval do define_method("#{name}_before_type_cast") do attribute_will_change!(name) read_attribute_before_type_cast(name) end end end |
#define_dynamic_reader(name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Define a reader method for a dynamic attribute.
39 40 41 42 43 44 45 46 47 48 |
# File 'lib/mongoid/attributes/dynamic.rb', line 39 def define_dynamic_reader(name) return unless name.valid_method_name? class_eval do define_method(name) do attribute_will_change!(name) read_raw_attribute(name) end end end |
#define_dynamic_writer(name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Define a writer method for a dynamic attribute.
79 80 81 82 83 84 85 86 87 |
# File 'lib/mongoid/attributes/dynamic.rb', line 79 def define_dynamic_writer(name) return unless name.valid_method_name? class_eval do define_method("#{name}=") do |value| write_attribute(name, value) end end end |
#inspect_dynamic_fields ⇒ String
Get an array of inspected dynamic fields for the document.
116 117 118 119 120 121 |
# File 'lib/mongoid/attributes/dynamic.rb', line 116 def inspect_dynamic_fields keys = attributes.keys - fields.keys - relations.keys - ["_id", "_type"] return keys.map do |name| "#{name}: #{attributes[name].inspect}" end end |
#process_attribute(name, value) ⇒ Object
If the attribute is dynamic, add a field for it with a type of object and set the value.
99 100 101 102 103 104 105 106 |
# File 'lib/mongoid/attributes/dynamic.rb', line 99 def process_attribute(name, value) responds = respond_to?("#{name}=") if !responds write_attribute(name, value) else send("#{name}=", value) end end |
#respond_to?(name, include_private = false) ⇒ true, false
Override respond_to? so it responds properly for dynamic attributes.
22 23 24 25 26 27 |
# File 'lib/mongoid/attributes/dynamic.rb', line 22 def respond_to?(name, include_private = false) super || ( attributes && attributes.has_key?(name.to_s.reader) ) end |