_.each @elements_items(), (item) =>\r
item.boosts(level) if item\r
\r
- replaced_attributes: (options = {}) ->\r
+ dig_elements: () ->\r
+ items = []\r
+ @_dig_elements(items, @attributes)\r
+ items\r
+ \r
+ _dig_elements: (items, attributes) ->\r
+ _.each attributes, (attribute, name) =>\r
+ a = @my_class().my_manifest().associations\r
+ if a.has_many[name]\r
+ _.each attribute, (attr) =>\r
+ items.push(attr)\r
+ Array.prototype.push.apply(items, attr.dig_elements())\r
+ if a.has_one[name]\r
+ items.push(attribute)\r
+ Array.prototype.push.apply(items, attribute.dig_elements())\r
+ \r
+ load_elements: (options) ->\r
+ @_load_elements(@dig_elements(), options)\r
+ \r
+ _load_elements: (items, options) ->\r
+ if _.isEmpty(items)\r
+ options.success.call(options.context, this)\r
+ return\r
+ item = items.shift()\r
+ item.fetch({\r
+ success: (model, response, opt) => \r
+ @_load_elements(items, options)\r
+ error: (item, response, opt) =>\r
+ options.fail.call(options.context, response, opt)\r
+ })\r
+ \r
+ decoded_attributes: () ->\r
attributes = {}\r
_.each @attributes, (attribute, name) =>\r
- replaced = if _.isArray(attribute)\r
+ a = @my_class().my_manifest().associations\r
+ decoded = if a.has_many[name]\r
# has many association\r
- model = @my_class().my_manifest().associations.has_many[name].model()\r
+ model = a.has_many[name].model()\r
_.map attribute, (attr) =>\r
+ child = @cache_child(model, attr)\r
+ child.attributes = child.decoded_attributes()\r
+ child\r
+ else if a.has_one[name]\r
+ # has one association\r
+ model = a.has_one[name].model()\r
+ child = @cache_child(model, attribute)\r
+ child.attributes = child.decoded_attributes()\r
+ child\r
+ else\r
+ attribute\r
+ attributes[name] = decoded\r
+ attributes\r
+ \r
+ replaced_attributes: (options = {}) ->\r
+ attributes = {}\r
+ _.each @attributes, (attribute, name) =>\r
+ console.log name\r
+ console.log attribute\r
+ a = @my_class().my_manifest().associations\r
+ replaced = if a.has_many[name]\r
+ # has many association\r
+ _.map attribute, (decoded) =>\r
child = if options.hold\r
- @replace_and_hold_element(model, attr)\r
+ @replace_and_hold_element(decoded)\r
else\r
- @replace_element(model, attr)\r
+ @replace_element(decoded)\r
+ console.log child\r
child.attributes = child.replaced_attributes(options)\r
child\r
- else if _.isObject(attribute)\r
+ else if a.has_one[name]\r
# has one association\r
- model = @my_class().my_manifest().associations.has_one[name].model()\r
child = if options.hold\r
- @replace_and_hold_element(model, attribute)\r
+ @replace_and_hold_element(attribute)\r
else\r
- @replace_element(model, attribute)\r
+ @replace_element(attribute)\r
child.attributes = child.replaced_attributes(options)\r
child\r
else\r
attribute\r
+ console.log replaced\r
attributes[name] = replaced\r
attributes\r
\r
- replace_element: (model, attr) ->\r
- empty_child = new model(attr)\r
- cached_child = Pettanr.cache.restore(empty_child)\r
- Pettanr.cache.store(empty_child) if !cached_child\r
- cached_child || empty_child\r
- \r
- replace_and_hold_element: (model, attr) ->\r
- empty_child = new model(attr)\r
- cached_child = Pettanr.cache.restore(empty_child)\r
+ replace_element: (decoded_child) ->\r
+ cached_child = Pettanr.cache.restore(decoded_child)\r
item = if cached_child\r
cached_child\r
else\r
- Pettanr.cache.store(empty_child) \r
- holden = item.hold()\r
- holden.attributes = attr\r
- holden\r
+ model = decoded_child.my_class()\r
+ caching_item = new model()\r
+ Pettanr.cache.store(caching_item)\r
+ item\r
+ \r
+ cache_child: (model, attr) ->\r
+ attr_without_element = {}\r
+ _.each attr, (a, n) ->\r
+ if !_.isObject(a) and !_.isArray(a)\r
+ attr_without_element[n] = a\r
+ decoded_child = new model(attr_without_element)\r
+ cached_child = Pettanr.cache.restore(decoded_child)\r
+ holden_item = if cached_child\r
+ cached_child.hold()\r
+ else\r
+ Pettanr.cache.store(decoded_child).hold()\r
+ holden_item.attributes = attr\r
+ holden_item\r
\r
hold: () ->\r
super()\r
\r
release_elements: () ->\r
_.each @attributes, (elements, name) =>\r
- if _.isArray(elements)\r
+ a = @my_class().my_manifest().associations\r
+ if a.has_many[name]\r
# has many association\r
- model = @my_class().my_manifest().associations.has_many[name].model()\r
_.each elements, (element) =>\r
element.release()\r
- else if _.isObject(elements)\r
+ else if a.has_one[name]\r
# has one association\r
elements.release()\r
\r
fix_elements: () ->\r
+ return \r
_.each @attributes, (elements, name) =>\r
- if _.isArray(elements)\r
+ a = @my_class().my_manifest().associations\r
+ if a.has_many[name]\r
# has many association\r
- model = @my_class().my_manifest().associations.has_many[name].model()\r
_.each elements, (element) =>\r
- element.fix()\r
- else if _.isObject(elements)\r
+ if @has('_destroy')\r
+ element.release() # destroy element by editor\r
+ else\r
+ element.fix()\r
+ else if a.has_one[name]\r
# has one association\r
- elements.fix()\r
+ if @has('_destroy')\r
+ element.release()\r
+ else\r
+ element.fix()\r
\r