Module: ActiveItem::ComposedOf

Extended by:
ActiveSupport::Concern
Included in:
Base
Defined in:
lib/active_item/composed_of.rb

Overview

Implements value object composition, allowing models to aggregate multiple attributes into a single nested DynamoDB map and expose them as a Ruby value object.

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#populate_composed_attributes_from_item(item) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/active_item/composed_of.rb', line 12

def populate_composed_attributes_from_item(item)
  self.class.compositions.each do |part_id, config|
    dynamo_key = self.class.to_dynamo_key(part_id.to_s)
    vo_class = config[:class_name].safe_constantize
    next unless vo_class

    next unless item[dynamo_key].is_a?(Hash)

    vo = if vo_class.respond_to?(:from_dynamo_map)
           vo_class.from_dynamo_map(item[dynamo_key])
         else
           kwargs = {}
           config[:mapping].each_value do |vo_attr|
             key = self.class.to_dynamo_key(vo_attr.to_s)
             kwargs[vo_attr] = item[dynamo_key][key] || item[dynamo_key][vo_attr.to_s]
           end
           vo_class.new(**kwargs)
         end

    instance_variable_set("@_composed_#{part_id}", vo)
    config[:mapping].each do |model_attr, vo_attr|
      instance_variable_set("@#{model_attr}", vo.send(vo_attr))
    end
  end
end