Module: MotionPrime::NanoBagMixin

Included in:
NSFNanoBag
Defined in:
motion-prime/models/_nano_bag_mixin.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



4
5
6
7
8
9
10
11
12
13
# File 'motion-prime/models/_nano_bag_mixin.rb', line 4

def self.included(base)
  base.class_eval do
    alias_method :saved, :savedObjects
    alias_method :unsaved, :unsavedObjects
    alias_method :removed, :removedObjects
    alias_method :size, :count
    alias_method :inflate, :inflateBag
    alias_method :deflate, :deflateBag
  end
end

Instance Method Details

#add(object_or_array) ⇒ Object Also known as: +, <<

Add an object or array of objects to bag

Raises:



33
34
35
36
37
38
39
40
41
42
43
44
# File 'motion-prime/models/_nano_bag_mixin.rb', line 33

def add(object_or_array)
  error_ptr = Pointer.new(:id)
  prepared = prepare_for_store(object_or_array)

  if object_or_array.is_a?(Array)
    self.addObjectsFromArray(prepared, error:error_ptr)
  else
    self.addObject(prepared, error:error_ptr)
  end
  raise StoreError, error_ptr[0].description if error_ptr[0]
  self
end

#changed?Boolean

Returns:

  • (Boolean)


19
20
21
# File 'motion-prime/models/_nano_bag_mixin.rb', line 19

def changed?
  self.hasUnsavedChanges
end

#delete(object_or_array) ⇒ Object Also known as: -

Remove an object or array of objects from bag

Parameters:

  • items (Array<Prime::Model>, Prime::Model)

    model or array of models to remove

Returns:

  • self

Raises:



77
78
79
80
81
82
83
84
85
86
# File 'motion-prime/models/_nano_bag_mixin.rb', line 77

def delete(object_or_array)
  error_ptr = Pointer.new(:id)
  if object_or_array.is_a?(Array)
    self.removeObjectsInArray(object_or_array, error: error_ptr)
  else
    self.removeObject(object_or_array, error_ptr)
  end
  raise StoreError, error_ptr[0].description if error_ptr[0]
  self
end

#delete_allObject Also known as: clear

Clear content of the bag

Returns:

  • self



92
93
94
95
96
97
98
99
# File 'motion-prime/models/_nano_bag_mixin.rb', line 92

def delete_all
  bag_copy = to_a.clone
  # this removes childrens from model
  delete(self.to_a)
  # this removes collection from db
  bag_copy.each(&:delete)
  self
end

#delete_key(key) ⇒ Object

Remove object from bag with key

Parameters:

  • key (String)

    a key or array of keys



64
65
66
67
68
69
70
71
# File 'motion-prime/models/_nano_bag_mixin.rb', line 64

def delete_key(key)
  if key.is_a?(Array)
    self.removeObjectsWithKeysInArray(key)
  else
    self.removeObjectWithKey(key)
  end
  self
end

#originalClassStringObject



15
16
17
# File 'motion-prime/models/_nano_bag_mixin.rb', line 15

def originalClassString
  'NSFNanoBag'
end

#prepare_for_store(object) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
# File 'motion-prime/models/_nano_bag_mixin.rb', line 48

def prepare_for_store(object)
  if object.is_a?(Array)
    object.map { |entity| prepare_for_store(entity) }.compact
  else
    object.bag_key = self.key
    if object.id.present? && self.store && self.find(id: object.id, bag_key: self.key).any?
      raise StoreError, "duplicated item added `#{object.class_name_without_kvo}` with `id` = #{object.id}"
    end
    object
  end
end

#reloadObject

Raises:



122
123
124
125
126
127
# File 'motion-prime/models/_nano_bag_mixin.rb', line 122

def reload
  error_ptr = Pointer.new(:id)
  result = self.reloadBagWithError(error_ptr)
  raise StoreError, error_ptr[0].description if error_ptr[0]
  result
end

#saveObject

Raises:



114
115
116
117
118
119
120
# File 'motion-prime/models/_nano_bag_mixin.rb', line 114

def save
  self.store ||= MotionPrime::Store.shared_store
  error_ptr = Pointer.new(:id)
  result = self.saveAndReturnError(error_ptr)
  raise StoreError, error_ptr[0].description if error_ptr[0]
  result
end

#store=(store, retry_count = 0) ⇒ Object



103
104
105
106
107
108
109
110
111
112
# File 'motion-prime/models/_nano_bag_mixin.rb', line 103

def store=(store, retry_count = 0)
  store.addObject(self, error: nil)
rescue Exception => e
  sleep(0.1)
  if retry_count == 3
    raise StoreError, e.description
  else
    send(:store=, store, retry_count + 1)
  end
end

#to_aObject

Return all objects in bag

Returns:

  • Array



26
27
28
# File 'motion-prime/models/_nano_bag_mixin.rb', line 26

def to_a
  self.savedObjects.values + self.unsavedObjects.values
end

#undoObject

Raises:



129
130
131
132
133
134
# File 'motion-prime/models/_nano_bag_mixin.rb', line 129

def undo
  error_ptr = Pointer.new(:id)
  result = self.undoChangesWithError(error_ptr)
  raise StoreError, error_ptr[0].description if error_ptr[0]
  result
end