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