hyper-model 1.0.alpha1.1 → 1.0.alpha1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/.rspec +0 -1
  4. data/Gemfile +6 -6
  5. data/Rakefile +27 -3
  6. data/hyper-model.gemspec +10 -19
  7. data/lib/active_record_base.rb +101 -33
  8. data/lib/hyper-model.rb +4 -2
  9. data/lib/hyper_model/version.rb +1 -1
  10. data/lib/hyper_react/input_tags.rb +2 -1
  11. data/lib/reactive_record/active_record/associations.rb +130 -34
  12. data/lib/reactive_record/active_record/base.rb +17 -0
  13. data/lib/reactive_record/active_record/class_methods.rb +124 -52
  14. data/lib/reactive_record/active_record/error.rb +2 -0
  15. data/lib/reactive_record/active_record/errors.rb +10 -6
  16. data/lib/reactive_record/active_record/instance_methods.rb +74 -6
  17. data/lib/reactive_record/active_record/reactive_record/backing_record_inspector.rb +22 -5
  18. data/lib/reactive_record/active_record/reactive_record/base.rb +56 -30
  19. data/lib/reactive_record/active_record/reactive_record/collection.rb +219 -70
  20. data/lib/reactive_record/active_record/reactive_record/dummy_polymorph.rb +22 -0
  21. data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +27 -15
  22. data/lib/reactive_record/active_record/reactive_record/getters.rb +33 -10
  23. data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +73 -46
  24. data/lib/reactive_record/active_record/reactive_record/lookup_tables.rb +5 -5
  25. data/lib/reactive_record/active_record/reactive_record/operations.rb +10 -3
  26. data/lib/reactive_record/active_record/reactive_record/scoped_collection.rb +3 -0
  27. data/lib/reactive_record/active_record/reactive_record/setters.rb +108 -71
  28. data/lib/reactive_record/active_record/reactive_record/while_loading.rb +258 -41
  29. data/lib/reactive_record/broadcast.rb +62 -25
  30. data/lib/reactive_record/interval.rb +3 -3
  31. data/lib/reactive_record/permissions.rb +14 -2
  32. data/lib/reactive_record/scope_description.rb +3 -2
  33. data/lib/reactive_record/server_data_cache.rb +99 -49
  34. data/polymorph-notes.md +143 -0
  35. data/spec_fails.txt +3 -0
  36. metadata +49 -162
  37. data/Gemfile.lock +0 -431
@@ -0,0 +1,22 @@
1
+ module ReactiveRecord
2
+ class DummyPolymorph
3
+ def initialize(vector)
4
+ @vector = vector
5
+ puts "VECTOR: #{@vector.inspect}"
6
+ Base.load_from_db(nil, *vector, 'id')
7
+ Base.load_from_db(nil, *vector, 'model_name')
8
+ end
9
+
10
+ def nil?
11
+ true
12
+ end
13
+
14
+ def method_missing(*)
15
+ self
16
+ end
17
+
18
+ def self.reflect_on_all_associations(*)
19
+ []
20
+ end
21
+ end
22
+ end
@@ -1,4 +1,4 @@
1
- # add mehods to Object to determine if this is a dummy object or not
1
+ # add methods to Object to determine if this is a dummy object or not
2
2
  class Object
3
3
  def loaded?
4
4
  !loading?
@@ -7,10 +7,6 @@ class Object
7
7
  def loading?
8
8
  false
9
9
  end
10
-
11
- def present?
12
- !!self
13
- end
14
10
  end
15
11
 
16
12
  module ReactiveRecord
@@ -36,6 +32,12 @@ module ReactiveRecord
36
32
  @column_hash[:default] || nil
37
33
  end
38
34
 
35
+ def build_default_value_for_json
36
+ ::JSON.parse(@column_hash[:default]) if @column_hash[:default]
37
+ end
38
+
39
+ alias build_default_value_for_jsonb build_default_value_for_json
40
+
39
41
  def build_default_value_for_datetime
40
42
  if @column_hash[:default]
41
43
  ::Time.parse(@column_hash[:default].gsub(' ','T')+'+00:00')
@@ -55,23 +57,26 @@ module ReactiveRecord
55
57
  end
56
58
  end
57
59
 
60
+ FALSY_VALUES = [false, nil, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"]
61
+
58
62
  def build_default_value_for_boolean
59
- @column_hash[:default] || false
63
+ !FALSY_VALUES.include?(@column_hash[:default])
60
64
  end
61
65
 
62
66
  def build_default_value_for_float
63
- @column_hash[:default] || Float(0.0)
67
+ @column_hash[:default]&.to_f || Float(0.0)
64
68
  end
65
69
 
66
70
  alias build_default_value_for_decimal build_default_value_for_float
67
71
 
68
72
  def build_default_value_for_integer
69
- @column_hash[:default] || Integer(0)
73
+ @column_hash[:default]&.to_i || Integer(0)
70
74
  end
71
75
 
72
76
  alias build_default_value_for_bigint build_default_value_for_integer
73
77
 
74
78
  def build_default_value_for_string
79
+ return @column_hash[:default] if @column_hash[:serialized?]
75
80
  @column_hash[:default] || ''
76
81
  end
77
82
 
@@ -91,10 +96,6 @@ module ReactiveRecord
91
96
  false
92
97
  end
93
98
 
94
- def present?
95
- false
96
- end
97
-
98
99
  def nil?
99
100
  true
100
101
  end
@@ -103,6 +104,11 @@ module ReactiveRecord
103
104
  true
104
105
  end
105
106
 
107
+ def class
108
+ notify
109
+ @object.class
110
+ end
111
+
106
112
  def method_missing(method, *args, &block)
107
113
  if method.start_with?("build_default_value_for_")
108
114
  nil
@@ -157,7 +163,13 @@ module ReactiveRecord
157
163
 
158
164
  alias inspect to_s
159
165
 
160
- `#{self}.$$proto.toString = Opal.Object.$$proto.toString`
166
+ %x{
167
+ if (Opal.Object.$$proto) {
168
+ #{self}.$$proto.toString = Opal.Object.$$proto.toString
169
+ } else {
170
+ #{self}.$$prototype.toString = Opal.Object.$$prototype.toString
171
+ }
172
+ }
161
173
 
162
174
  def to_f
163
175
  notify
@@ -215,10 +227,10 @@ module ReactiveRecord
215
227
  # to convert it to a string, for rendering
216
228
  # advantage over a try(:method) is, that it doesnt raise und thus is faster
217
229
  # which is important during render
218
- def respond_to?(method)
230
+ def respond_to?(method, all = false)
219
231
  return true if method == :acts_as_string?
220
232
  return true if %i[inspect to_date to_f to_i to_numeric to_number to_s to_time].include? method
221
- return @object.respond_to? if @object
233
+ return @object.respond_to?(method, all) if @object
222
234
  false
223
235
  end
224
236
 
@@ -4,9 +4,13 @@ module ReactiveRecord
4
4
  module Getters
5
5
  def get_belongs_to(assoc, reload = nil)
6
6
  getter_common(assoc.attribute, reload) do |has_key, attr|
7
- return if new?
8
- value = Base.fetch_from_db([@model, [:find, id], attr, @model.primary_key]) if id.present?
9
- value = find_association(assoc, value)
7
+ next if new?
8
+ if id.present?
9
+ value = fetch_by_id(attr, @model.primary_key)
10
+ klass = fetch_by_id(attr, 'model_name')
11
+ klass &&= Object.const_get(klass)
12
+ end
13
+ value = find_association(assoc, value, klass)
10
14
  sync_ignore_dummy attr, value, has_key
11
15
  end&.cast_to_current_sti_type
12
16
  end
@@ -33,7 +37,8 @@ module ReactiveRecord
33
37
 
34
38
  def get_server_method(attr, reload = nil)
35
39
  non_relationship_getter_common(attr, reload) do |has_key|
36
- sync_ignore_dummy attr, Base.load_from_db(self, *(vector ? vector : [nil]), attr), has_key
40
+ # SPLAT BUG: was sync_ignore_dummy attr, Base.load_from_db(self, *(vector ? vector : [nil]), attr), has_key
41
+ sync_ignore_dummy attr, Base.load_from_db(self, *(vector || [nil]), *attr), has_key
37
42
  end
38
43
  end
39
44
 
@@ -75,10 +80,16 @@ module ReactiveRecord
75
80
  if new?
76
81
  yield has_key if block
77
82
  elsif on_opal_client?
78
- sync_ignore_dummy attr, Base.load_from_db(self, *(vector ? vector : [nil]), attr), has_key
83
+ # SPLAT BUG: was sync_ignore_dummy attr, Base.load_from_db(self, *(vector ? vector : [nil]), attr), has_key
84
+ sync_ignore_dummy attr, Base.load_from_db(self, *(vector || [nil]), *attr), has_key
79
85
  elsif id.present?
80
- sync_attribute attr, Base.fetch_from_db([@model, [:find, id], attr])
86
+ sync_attribute attr, fetch_by_id(attr)
81
87
  else
88
+ # Not sure how to test this branch, it may never execute this line?
89
+ # If we are on opal_server then we should always be getting an id before getting here
90
+ # but if we do vector might not be set up properly to fetch the attribute
91
+ puts "*** Syncing attribute in getters.rb without an id. This may cause problems. ***"
92
+ puts "*** Report this to hyperstack.org if you see this message: vector = #{[*vector, attr]}"
82
93
  sync_attribute attr, Base.fetch_from_db([*vector, attr])
83
94
  end
84
95
  end
@@ -99,18 +110,26 @@ module ReactiveRecord
99
110
  else
100
111
  virtual_fetch_on_server_warning(attribute) if on_opal_server? && changed?
101
112
  yield false, attribute
102
- end.tap { |value| Hyperstack::Internal::Store::State.get_state(self, attribute) unless data_loading? }
113
+ end.tap { Hyperstack::Internal::State::Variable.get(self, attribute) unless data_loading? }
103
114
  end
104
115
 
105
- def find_association(association, id)
106
- inverse_of = association.inverse_of
116
+ def find_association(association, id, klass)
107
117
  instance = if id
108
- find(association.klass, association.klass.primary_key => id)
118
+ find(klass, klass.primary_key => id)
119
+ elsif association.polymorphic?
120
+ new_from_vector(nil, nil, *vector, association.attribute)
109
121
  else
110
122
  new_from_vector(association.klass, nil, *vector, association.attribute)
111
123
  end
124
+ return instance if instance.is_a? DummyPolymorph
125
+ inverse_of = association.inverse_of(instance)
112
126
  instance_backing_record_attributes = instance.attributes
113
127
  inverse_association = association.klass.reflect_on_association(inverse_of)
128
+ # HMT-TODO: don't we need to do something with the through association case.
129
+ # perhaps we never hit this point...
130
+ if association.through_association?
131
+ IsomorphicHelpers.log "*********** called #{ar_instance}.find_association(#{association.attribute}) which is has many through!!!!!!!", :error
132
+ end
114
133
  if inverse_association.collection?
115
134
  instance_backing_record_attributes[inverse_of] = if id and id != ""
116
135
  Collection.new(@model, instance, inverse_association, association.klass, ["find", id], inverse_of)
@@ -129,5 +148,9 @@ module ReactiveRecord
129
148
  self.aggregate_attribute = attr
130
149
  @ar_instance
131
150
  end
151
+
152
+ def fetch_by_id(*vector)
153
+ Base.fetch_from_db([@model, *find_by_vector(@model.primary_key => id), *vector])
154
+ end
132
155
  end
133
156
  end
@@ -10,6 +10,7 @@ module ReactiveRecord
10
10
  if RUBY_ENGINE != 'opal'
11
11
  @server_data_cache = ReactiveRecord::ServerDataCache.new(context.controller.acting_user, {})
12
12
  else
13
+ Hyperstack::Internal::State::Variable.set(WhileLoading, :quiet, true)
13
14
  @public_columns_hash = get_public_columns_hash
14
15
  define_attribute_methods
15
16
  @outer_scopes = Set.new
@@ -46,6 +47,15 @@ module ReactiveRecord
46
47
  self.class.instance_variable_get(:@records)
47
48
  end
48
49
 
50
+ # constructs vector for find_by
51
+ def self.find_by_vector(attrs)
52
+ [:all, [:___hyperstack_internal_scoped_find_by, attrs], '*0']
53
+ end
54
+
55
+ def find_by_vector(attrs)
56
+ self.class.find_by_vector(attrs)
57
+ end
58
+
49
59
  # Prerendering db access (returns nil if on client):
50
60
  # at end of prerendering dumps all accessed records in the footer
51
61
 
@@ -57,7 +67,9 @@ module ReactiveRecord
57
67
 
58
68
  isomorphic_method(:find_in_db) do |f, klass, attrs|
59
69
  f.send_to_server klass.name, attrs if RUBY_ENGINE == 'opal'
60
- f.when_on_server { @server_data_cache[klass, ['find_by', attrs], 'id'] }
70
+ f.when_on_server do
71
+ @server_data_cache[klass, *find_by_vector(attrs), 'id']
72
+ end
61
73
  end
62
74
 
63
75
  class << self
@@ -123,7 +135,6 @@ module ReactiveRecord
123
135
  model.columns_hash[method_name] || model.server_methods[method_name]
124
136
  end
125
137
 
126
-
127
138
  class << self
128
139
 
129
140
  attr_reader :pending_fetches
@@ -132,7 +143,7 @@ module ReactiveRecord
132
143
  end
133
144
 
134
145
  def self.schedule_fetch
135
- Hyperstack::Internal::Store::State.set_state(WhileLoading, :quiet, false) # moved from while loading module see loading! method
146
+ Hyperstack::Internal::State::Variable.set(WhileLoading, :quiet, false) # moved from while loading module see loading! method
136
147
  return if @fetch_scheduled
137
148
  @current_fetch_id = Time.now
138
149
  @fetch_scheduled = after(0) do
@@ -222,7 +233,7 @@ module ReactiveRecord
222
233
  if association.collection?
223
234
  # following line changed from .all to .collection on 10/28
224
235
  [*value.collection, *value.unsaved_children].each do |assoc|
225
- add_new_association.call(record, attribute, assoc.backing_record) if assoc.changed?(association.inverse_of) or assoc.new?
236
+ add_new_association.call(record, attribute, assoc.backing_record) if assoc.changed?(association.inverse_of(assoc)) or assoc.new_record?
226
237
  end
227
238
  elsif record.new? || record.changed?(attribute) || (record == record_being_saved && force)
228
239
  if value.nil?
@@ -231,7 +242,7 @@ module ReactiveRecord
231
242
  add_new_association.call record, attribute, value.backing_record
232
243
  end
233
244
  end
234
- elsif aggregation = record.model.reflect_on_aggregation(attribute) and (aggregation.klass < ActiveRecord::Base)
245
+ elsif (aggregation = record.model.reflect_on_aggregation(attribute)) && (aggregation.klass < ActiveRecord::Base)
235
246
  add_new_association.call record, attribute, value.backing_record unless value.nil?
236
247
  elsif aggregation
237
248
  new_value = aggregation.serialize(value)
@@ -242,7 +253,7 @@ module ReactiveRecord
242
253
  end if record.new? || record.changed? || (record == record_being_saved && force)
243
254
  record_index += 1
244
255
  end
245
- [models, associations, backing_records]
256
+ [models.sort_by { |model| model[:id] }, associations, backing_records]
246
257
  end
247
258
 
248
259
  def save_or_validate(save, validate, force, &block)
@@ -252,8 +263,17 @@ module ReactiveRecord
252
263
  HyperMesh.load do
253
264
  ReactiveRecord.loads_pending! unless self.class.pending_fetches.empty?
254
265
  end.then { send_save_to_server(save, validate, force, &block) }
255
- #save_to_server(validate, force, &block)
256
266
  else
267
+ if validate
268
+ # Handles the case where a model is valid, then some attribute is
269
+ # updated, and model.validate is called updating the error data.
270
+ # Now lets say the attribute changes back to the last synced value. In
271
+ # this case we need to revert the error records.
272
+ models, _, backing_records = self.class.gather_records([self], true, self)
273
+ models.each do |item|
274
+ backing_records[item[:id]].revert_errors!
275
+ end
276
+ end
257
277
  promise = Promise.new
258
278
  yield true, nil, [] if block
259
279
  promise.resolve({success: true})
@@ -290,14 +310,13 @@ module ReactiveRecord
290
310
 
291
311
  response[:saved_models].each do | item |
292
312
  backing_records[item[0]].sync_unscoped_collection! if save
293
- backing_records[item[0]].errors! item[3]
313
+ backing_records[item[0]].errors! item[3], save
294
314
  end
295
315
 
296
316
  yield response[:success], response[:message], response[:models] if block
297
317
  promise.resolve response # TODO this could be problematic... there was no .json here, so .... what's to do?
298
318
 
299
319
  rescue Exception => e
300
- # debugger
301
320
  log("Exception raised while saving - #{e}", :error)
302
321
  ensure
303
322
  backing_records.each { |_id, record| record.saved! rescue nil } if save
@@ -316,25 +335,29 @@ module ReactiveRecord
316
335
 
317
336
  else
318
337
 
319
- def self.find_record(model, id, vector, save)
338
+ def self.find_record(model, id, acting_user, vector, save)
320
339
  if !save
321
340
  found = vector[1..-1].inject(vector[0]) do |object, method|
322
341
  if object.nil? # happens if you try to do an all on empty scope followed by more scopes
323
342
  object
324
- elsif method.is_a? Array
343
+ elsif method.is_a? Array #__secure_remote_access_to_
325
344
  if method[0] == 'new'
326
345
  object.new
327
346
  else
328
- object.send(*method)
347
+ object.send(:"__secure_remote_access_to_#{method[0]}", object, acting_user, *method[1..-1])
329
348
  end
330
- elsif method.is_a? String and method[0] == '*'
349
+ elsif method.is_a?(String) && method[0] == '*'
331
350
  object[method.gsub(/^\*/,'').to_i]
332
351
  else
333
- object.send(method)
352
+ object.send(:"__secure_remote_access_to_#{method}", object, acting_user)
334
353
  end
335
354
  end
336
355
  if id and (found.nil? or !(found.class <= model) or (found.id and found.id.to_s != id.to_s))
337
- raise "Inconsistent data sent to server - #{model.name}.find(#{id}) != [#{vector}]"
356
+ # TODO: the one case that this is okay is when we are doing a find(some_id) which
357
+ # does not exist. So the above check needs to deal with that if possible,
358
+ # otherwise we can just skip this check, as it was put in sometime back for
359
+ # debugging purposes, and is perhaps not necessary anymore
360
+ #raise "Inconsistent data sent to server - #{model.name}.find(#{id}) != [#{vector}]"
338
361
  end
339
362
  found
340
363
  elsif id
@@ -362,13 +385,13 @@ module ReactiveRecord
362
385
  id = attributes.delete(model.primary_key) if model.respond_to? :primary_key # if we are saving existing model primary key value will be present
363
386
  vector = model_to_save[:vector]
364
387
  vector = [vector[0].constantize] + vector[1..-1].collect do |method|
365
- if method.is_a?(Array) and method.first == "find_by_id"
388
+ if method.is_a?(Array) && method.first == "find_by_id"
366
389
  ["find", method.last]
367
390
  else
368
391
  method
369
392
  end
370
393
  end
371
- reactive_records[model_to_save[:id]] = vectors[vector] = record = find_record(model, id, vector, save) # ??? || validate ???
394
+ reactive_records[model_to_save[:id]] = vectors[vector] = record = find_record(model, id, acting_user, vector, save) # ??? || validate ???
372
395
  next unless record
373
396
  if attributes.empty?
374
397
  dont_save_list << record unless save
@@ -434,24 +457,29 @@ module ReactiveRecord
434
457
  parent.send("#{association[:attribute]}=", aggregate)
435
458
  #puts "updated is frozen? #{aggregate.frozen?}, parent attributes = #{parent.send(association[:attribute]).attributes}"
436
459
  elsif parent.class.reflect_on_association(association[:attribute].to_sym).nil?
437
- raise "Missing association :#{association[:attribute]} for #{parent.class.name}. Was association defined on opal side only?"
460
+ raise "Missing association :#{association[:attribute]} for #{parent.class.name}. Was association defined on opal side only?"
438
461
  elsif parent.class.reflect_on_association(association[:attribute].to_sym).collection?
439
462
  #puts ">>>>>>>>>> #{parent.class.name}.send('#{association[:attribute]}') << #{reactive_records[association[:child_id]]})"
440
463
  dont_save_list.delete(parent)
441
- #if false and parent.new?
442
- #parent.send("#{association[:attribute]}") << reactive_records[association[:child_id]]
443
- # puts "updated"
444
- #else
445
- #puts "skipped"
446
- #end
464
+
465
+ # if reactive_records[association[:child_id]]&.new_record?
466
+ # dont_save_list << reactive_records[association[:child_id]]
467
+ # end
468
+
469
+ if parent.new_record?
470
+ parent.send("#{association[:attribute]}") << reactive_records[association[:child_id]]
471
+ end
447
472
  else
448
473
  #puts ">>>>ASSOCIATION>>>> #{parent.class.name}.send('#{association[:attribute]}=', #{reactive_records[association[:child_id]]})"
449
474
  parent.send("#{association[:attribute]}=", reactive_records[association[:child_id]])
450
475
  dont_save_list.delete(parent)
451
- #puts "updated"
476
+
477
+ # if parent.class.reflect_on_association(association[:attribute].to_sym).macro == :has_one &&
478
+ # reactive_records[association[:child_id]]&.new_record?
479
+ # dont_save_list << reactive_records[association[:child_id]]
480
+ # end
452
481
  end
453
482
  end if associations
454
-
455
483
  # get rid of any records that don't require further processing, as a side effect
456
484
  # we also save any records that need to be saved (these may be rolled back later.)
457
485
 
@@ -460,10 +488,13 @@ module ReactiveRecord
460
488
  next true if record.frozen? # skip (but process later) frozen records
461
489
  next true if dont_save_list.include?(record) # skip if the record is on the don't save list
462
490
  next true if record.changed.include?(record.class.primary_key) # happens on an aggregate
463
- next false if record.id && !record.changed? # throw out any existing records with no changes
491
+ #next true if record.persisted? # record may be have been saved as result of has_one assignment
492
+ # next false if record.id && !record.changed? # throw out any existing records with no changes
493
+ next record.persisted? if record.id && !record.changed?
464
494
  # if we get to here save the record and return true to keep it
465
495
  op = new_models.include?(record) ? :create_permitted? : :update_permitted?
466
- record.check_permission_with_acting_user(acting_user, op).save(validate: false) || true
496
+
497
+ record.check_permission_with_acting_user(acting_user, op).save(validate: validate) || true
467
498
  end
468
499
 
469
500
  # if called from ServerDataCache then save and validate are both false, and we just return the
@@ -476,14 +507,15 @@ module ReactiveRecord
476
507
  # the all the error messages during a save so we can dump them to the server log.
477
508
 
478
509
  all_messages = []
510
+ attributes = nil
479
511
 
480
512
  saved_models = reactive_records.collect do |reactive_record_id, model|
481
513
  messages = model.errors.messages if validate && !model.valid?
482
514
  all_messages << [model, messages] if save && messages
483
515
  attributes = model.__hyperstack_secure_attributes(acting_user)
516
+ attributes[model.class.primary_key] = model[model.class.primary_key]
484
517
  [reactive_record_id, model.class.name, attributes, messages]
485
518
  end
486
-
487
519
  # if we are not saving (i.e. just validating) then we rollback the transaction
488
520
 
489
521
  raise ActiveRecord::Rollback, 'This Rollback is intentional!' unless save
@@ -498,7 +530,6 @@ module ReactiveRecord
498
530
  end
499
531
  raise 'HyperModel saving records failed!'
500
532
  end
501
-
502
533
  end
503
534
 
504
535
  { success: true, saved_models: saved_models }
@@ -507,7 +538,7 @@ module ReactiveRecord
507
538
  if save || validate
508
539
  {success: false, saved_models: saved_models, message: e}
509
540
  else
510
- {}
541
+ raise e # was returning {} TODO verify that just raising the error at least reports the error
511
542
  end
512
543
  end
513
544
 
@@ -518,14 +549,12 @@ module ReactiveRecord
518
549
  if RUBY_ENGINE == 'opal'
519
550
 
520
551
  def destroy(&block)
552
+ return if @destroyed || @being_destroyed
521
553
 
522
- return if @destroyed
523
-
524
- #destroy_associations
554
+ # destroy_associations
525
555
 
526
556
  promise = Promise.new
527
-
528
- if !data_loading? and (id or vector)
557
+ if !data_loading? && (id || vector)
529
558
  Operations::Destroy.run(model: ar_instance.model_name.to_s, id: id, vector: vector)
530
559
  .then do |response|
531
560
  Broadcast.to_self ar_instance
@@ -536,7 +565,7 @@ module ReactiveRecord
536
565
  destroy_associations
537
566
  # sync_unscoped_collection! # ? should we do this here was NOT being done before hypermesh integration
538
567
  yield true, nil if block
539
- promise.resolve({success: true})
568
+ promise.resolve(success: true)
540
569
  end
541
570
 
542
571
  # DO NOT CLEAR ATTRIBUTES. Records that are not found, are destroyed, and if they are searched for again, we want to make
@@ -556,18 +585,16 @@ module ReactiveRecord
556
585
  def self.destroy_record(model, id, vector, acting_user)
557
586
  model = Object.const_get(model)
558
587
  record = if id
559
- model.find(id)
560
- else
561
- ServerDataCache.new(acting_user, {})[*vector]
562
- end
563
-
588
+ model.find(id)
589
+ else
590
+ ServerDataCache.new(acting_user, {})[*vector].value
591
+ end
564
592
 
565
593
  record.check_permission_with_acting_user(acting_user, :destroy_permitted?).destroy
566
- {success: true, attributes: {}}
567
-
594
+ { success: true, attributes: {} }
568
595
  rescue Exception => e
569
- #ReactiveRecord::Pry.rescued(e)
570
- {success: false, record: record, message: e}
596
+ # ReactiveRecord::Pry.rescued(e)
597
+ { success: false, record: record, message: e }
571
598
  end
572
599
  end
573
600
  end