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)