Module: Disposable::Twin::Sync

Includes:
SyncOptions, ToNestedHash, Writeable
Defined in:
lib/disposable/twin/sync.rb

Defined Under Namespace

Modules: SkipGetter, SkipUnchanged, SyncOptions, ToNestedHash, Writeable Classes: Options

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Writeable

#sync_options

Methods included from SyncOptions

#sync_options

Methods included from ToNestedHash

#nested_hash_source, #to_nested_hash

Class Method Details

.hash_representer(twin_class, &block) ⇒ Object

Creates a fresh copy of the internal representer and adds Representable::Hash. This is used wherever a hash transformation is needed.



22
23
24
25
26
27
28
29
30
31
# File 'lib/disposable/twin/sync.rb', line 22

def self.hash_representer(twin_class, &block)
  Disposable::Rescheme.from(twin_class,
    recursive: false,
    definitions_from: lambda { |twin_klass| twin_klass.definitions },
    superclass: Representable::Decorator,
    include: Representable::Hash,
    exclude_options: [:default], # TODO: TEST IN default_test.
    &block
  )
end

Instance Method Details

#sync!(options) ⇒ Object

Sync all scalar attributes, call sync! on nested and return model.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/disposable/twin/sync.rb', line 41

def sync!(options) # semi-public.
  # TODO: merge this into Sync::Run or something and use in Struct, too, so we don't
  # need the representer anymore?
  options_for_sync = sync_options(Options[options])

  schema.each(options_for_sync) do |dfn|
    property_value = sync_read(dfn) #

    unless dfn[:nested]
      mapper.send(dfn.setter, property_value) # always sync the property
      next
    end

    # First, call sync! on nested model(s).
    nested_model = PropertyProcessor.new(dfn, self, property_value).() { |twin| twin.sync!({}) }
    next if nested_model.nil?

    # Then, write nested model to parent model, e.g. model.songs = [<Song>]
    mapper.send(dfn.setter, nested_model) # @model.artist = <Artist>
  end

  model
end

#sync_models(options = {}) ⇒ Object Also known as: sync



33
34
35
36
37
# File 'lib/disposable/twin/sync.rb', line 33

def sync_models(options={})
  return yield to_nested_hash if block_given?

  sync!(options)
end