lib/ecoportal/api/common/base_model.rb in ecoportal-api-0.4.1 vs lib/ecoportal/api/common/base_model.rb in ecoportal-api-0.4.2

- old
+ new

@@ -51,18 +51,18 @@ end end def doc raise UnlinkedModel.new unless linked? - return _parent.doc[_key] unless _parent == self - @doc + return @doc if is_root? + _parent.doc.dig(*[_key].flatten) end def original_doc raise UnlinkedModel.new unless linked? - return _parent.original_doc[_key] unless _parent == self - @original_doc + return @original_doc if is_root? + _parent.original_doc.dig(*[_key].flatten) end def as_json doc end @@ -80,37 +80,50 @@ as_update != {} end def consolidate! raise UnlinkedModel.new unless linked? - case - when @original_doc - @original_doc = JSON.parse(@doc.to_json) + new_doc = JSON.parse(doc.to_json) + if is_root? + @original_doc = new_doc else - _parent.original_doc[_key] = JSON.parse(doc.to_json) + dig_set(_parent.original_doc, [_key].flatten, new_doc) end end def reset! raise UnlinkedModel.new unless linked? - case - when @doc - @doc = JSON.parse(@original_doc.to_json) + new_doc = JSON.parse(original_doc.to_json) + if is_root? + @doc = new_doc else - _parent.doc[_key] = JSON.parse(original_doc.to_json) + dig_set(_parent.doc, [_key].flatten, new_doc) end end def print puts JSON.pretty_generate(as_json) self end protected + def is_root? + _parent == self && !!defined?(@doc) + end + def linked? - is_root = _parent == self && defined?(@doc) - is_root || _parent.doc[_key] + is_root? || !!_parent.doc.dig(*[_key].flatten) + end + + private + + def dig_set(obj, keys, value) + if keys.length == 1 + obj[keys.first] = value + else + dig_set(obj[keys.first], keys.slice(1..-1), value) + end end end end end