lib/isomorfeus/data/object_accelerator.rb in isomorfeus-data-2.5.4 vs lib/isomorfeus/data/object_accelerator.rb in isomorfeus-data-2.5.5

- old
+ new

@@ -18,10 +18,11 @@ ObjectSpace.define_finalizer(self, self.class.finalize(self)) end def object_from_ref(ref, already_loaded) + return nil if !ref || ref.empty? _, iso, type_class_name, key = ref.split('---') raise "not a valid object reference '#{ref}'" unless iso == "iso-object-reference" raise "invalid data class #{type_class_name}" unless Isomorfeus.valid_data_class_name?(type_class_name) type_class = Isomorfeus.cached_data_class(type_class_name) type_class.load(key: key, _already_loaded: already_loaded) @@ -97,18 +98,33 @@ private def unserialize_or_load(v, t, already_loaded) return unserialize(v) if t == :attribute if t == :object && v - return nil if v.empty? - return object_from_ref(v, already_loaded) + if v.is_a?(Array) + v = v.map { |e| object_from_ref(e, already_loaded) } + v.compact! + return v + else + return nil if v.empty? + return object_from_ref(v, already_loaded) + end end v end def serialize_or_save(v, t, already_saved) return serialize(v) if t == :attribute - return create_or_save(v, already_saved) if t == :object && v + if t == :object && v + if v.is_a?(Array) + v = v.compact + v.map! { |e| create_or_save(e, already_saved) } + v.compact! + return v + else + return create_or_save(v, already_saved) + end + end v end def create_or_save(v, already_saved) if get_object_id(v.key)