Class: Persistors::ModelStore

Inherits:
Store show all
Includes:
StoreState
Defined in:
lib/volt/models/persistors/model_store.rb

Constant Summary collapse

ID_CHARS =
[('a'..'f'), ('0'..'9')].map {|v| v.to_a }.flatten

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from StoreState

#change_state_to, #loaded, #state

Methods inherited from Store

#read_new_model, #saved?

Methods inherited from Base

#added, #event_removed, #loaded, #removed

Constructor Details

#initialize(model, tasks) ⇒ ModelStore

Returns a new instance of ModelStore.



13
14
15
16
17
# File 'lib/volt/models/persistors/model_store.rb', line 13

def initialize(model, tasks)
  super

  @in_identity_map = false
end

Instance Attribute Details

#in_identity_mapObject

Returns the value of attribute in_identity_map.



11
12
13
# File 'lib/volt/models/persistors/model_store.rb', line 11

def in_identity_map
  @in_identity_map
end

#modelObject (readonly)

Returns the value of attribute model.



10
11
12
# File 'lib/volt/models/persistors/model_store.rb', line 10

def model
  @model
end

Class Method Details

.changed(model_id, data) ⇒ Object

Update the models based on the id/identity map. Usually these requests will come from the backend.



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/volt/models/persistors/model_store.rb', line 93

def self.changed(model_id, data)
  model = @@identity_map.lookup(model_id)

  if model
    data.each_pair do |key, value|
      if key != '_id'
        model.send(:"#{key}=", value)
      end
    end
  end
end

Instance Method Details

#[](val) ⇒ Object



105
106
107
# File 'lib/volt/models/persistors/model_store.rb', line 105

def [](val)
  raise "Models do not support hash style lookup.  Hashes inserted into other models are converted to models, see https://github.com/voltrb/volt#automatic-model-conversion"
end

#add_to_collectionObject



19
20
21
22
23
# File 'lib/volt/models/persistors/model_store.rb', line 19

def add_to_collection
  @in_collection = true
  ensure_setup
  changed
end

#add_to_identity_mapObject



38
39
40
41
42
43
44
# File 'lib/volt/models/persistors/model_store.rb', line 38

def add_to_identity_map
  unless @in_identity_map
    @@identity_map.add(@model._id, @model)

    @in_identity_map = true
  end
end

#changed(attribute_name = nil) ⇒ Object

Called when the model changes



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/volt/models/persistors/model_store.rb', line 55

def changed(attribute_name=nil)
  path = @model.path

  promise = Promise.new

  ensure_setup

  path_size = path.size
  if !(defined?($loading_models) && $loading_models) && @tasks && path_size > 0 && !@model.nil?
    if path_size > 3 && (parent = @model.parent) && source = parent.parent
      @model.attributes[:"#{path[-4].singularize}_id"] = source._id
    end

    if !collection
      puts "Attempting to save model directly on store."
      raise "Attempting to save model directly on store."
    else
      @tasks.call('StoreTasks', 'save', collection, self_attributes) do |errors|
        if errors.size == 0
          promise.resolve
        else
          promise.reject(errors)
        end
      end
    end
  end

  return promise
end

#ensure_setupObject

Called the first time a value is assigned into this model



30
31
32
33
34
35
36
# File 'lib/volt/models/persistors/model_store.rb', line 30

def ensure_setup
  if @model.attributes
    @model.attributes[:_id] ||= generate_id

    add_to_identity_map
  end
end

#event_added(event, scope_provider, first, first_for_event) ⇒ Object



85
86
87
88
89
# File 'lib/volt/models/persistors/model_store.rb', line 85

def event_added(event, scope_provider, first, first_for_event)
  if first_for_event && event == :changed
    ensure_setup
  end
end

#generate_idObject

Create a random unique id that can be used as the mongo id as well



47
48
49
50
51
52
# File 'lib/volt/models/persistors/model_store.rb', line 47

def generate_id
  id = []
  24.times { id << ID_CHARS.sample }

  return id.join
end

#remove_from_collectionObject



25
26
27
# File 'lib/volt/models/persistors/model_store.rb', line 25

def remove_from_collection
  @in_collection = false
end