Class: ROM::Mapper
- Inherits:
-
Object
- Object
- ROM::Mapper
- Includes:
- DSL
- Defined in:
- core/lib/rom/mapper.rb,
core/lib/rom/mapper/dsl.rb,
core/lib/rom/mapper/builder.rb,
core/lib/rom/mapper/model_dsl.rb,
core/lib/rom/mapper/attribute_dsl.rb
Overview
Mapper is a simple object that uses transformers to load relations
Defined Under Namespace
Modules: DSL, ModelDSL Classes: AttributeDSL, Builder
Instance Attribute Summary collapse
-
#header ⇒ Header
readonly
private
Header that was used to build the transformers.
-
#transformers ⇒ Object
readonly
private
Transformers object built by a processor.
Class Method Summary collapse
-
.build(header = self.header, processor = :transproc) ⇒ Mapper
private
Build a mapper using provided processor type.
-
.headers(header) ⇒ Array<Header>
private
Prepares an array of headers for a potentially multistep mapper.
-
.processors ⇒ Hash
private
Registered processors.
-
.register_processor(processor) ⇒ Hash
private
Register a processor class.
- .registry(descendants) ⇒ Object private
Instance Method Summary collapse
-
#call(relation) ⇒ Object
private
Process a relation using the transformers.
-
#initialize(header, processor = :transproc) ⇒ Mapper
constructor
private
A new instance of Mapper.
-
#model ⇒ Class
private
Optional model that is instantiated by a mapper.
Constructor Details
#initialize(header, processor = :transproc) ⇒ Mapper
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.
Returns a new instance of Mapper.
78 79 80 81 82 83 84 |
# File 'core/lib/rom/mapper.rb', line 78 def initialize(header, processor = :transproc) processor = Mapper.processors.fetch(processor) @transformers = self.class.headers(header).map do |hdr| processor.build(self, hdr) end @header = header end |
Instance Attribute Details
#header ⇒ Header (readonly)
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.
Returns header that was used to build the transformers.
29 30 31 |
# File 'core/lib/rom/mapper.rb', line 29 def header @header end |
#transformers ⇒ Object (readonly)
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.
Returns transformers object built by a processor.
24 25 26 |
# File 'core/lib/rom/mapper.rb', line 24 def transformers @transformers end |
Class Method Details
.build(header = self.header, processor = :transproc) ⇒ Mapper
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.
Build a mapper using provided processor type
65 66 67 |
# File 'core/lib/rom/mapper.rb', line 65 def self.build(header = self.header, processor = :transproc) new(header, processor) end |
.headers(header) ⇒ Array<Header>
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.
Prepares an array of headers for a potentially multistep mapper
53 54 55 56 57 58 |
# File 'core/lib/rom/mapper.rb', line 53 def self.headers(header) return [header] if steps.empty? return steps.map(&:header) if attributes.empty? raise(MapperMisconfiguredError, 'cannot mix outer attributes and steps') end |
.processors ⇒ Hash
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.
Returns registered processors.
34 35 36 |
# File 'core/lib/rom/mapper.rb', line 34 def self.processors @_processors ||= {} end |
.register_processor(processor) ⇒ Hash
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.
Register a processor class
43 44 45 46 |
# File 'core/lib/rom/mapper.rb', line 43 def self.register_processor(processor) name = processor.name.split('::').last.downcase.to_sym processors.update(name => processor) end |
.registry(descendants) ⇒ 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.
70 71 72 73 74 75 |
# File 'core/lib/rom/mapper.rb', line 70 def self.registry(descendants) descendants.each_with_object({}) do |klass, h| name = klass.register_as || klass.relation (h[klass.base_relation] ||= {})[name] = klass.build end end |
Instance Method Details
#call(relation) ⇒ 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.
Process a relation using the transformers
96 97 98 |
# File 'core/lib/rom/mapper.rb', line 96 def call(relation) transformers.reduce(relation.to_a) { |a, e| e.call(a) } end |
#model ⇒ Class
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.
Returns optional model that is instantiated by a mapper.
89 90 91 |
# File 'core/lib/rom/mapper.rb', line 89 def model header.model end |