From 94011e11c3d8e8ed5e34b2013798758c35418cda Mon Sep 17 00:00:00 2001 From: Ray Cohen Date: Mon, 28 Jan 2013 00:42:20 -0500 Subject: [PATCH] Prevent duplicate handling of sideloaded values when there are complex relationships --- .../lib/serializers/json_serializer.js | 3 +- .../integration/json_serialization_test.js | 57 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/packages/ember-data/lib/serializers/json_serializer.js b/packages/ember-data/lib/serializers/json_serializer.js index 74027c62f66..837947b756d 100644 --- a/packages/ember-data/lib/serializers/json_serializer.js +++ b/packages/ember-data/lib/serializers/json_serializer.js @@ -218,6 +218,7 @@ DS.JSONSerializer = DS.Serializer.extend({ }, sideloadRelationships: function(loader, type, json, prop, loaded) { + if (loaded[prop]) { return; } loaded[prop] = true; get(type, 'relationshipsByName').forEach(function(key, meta) { @@ -225,7 +226,7 @@ DS.JSONSerializer = DS.Serializer.extend({ if (meta.kind === 'belongsTo') { key = this.pluralize(key); } - if (json[key] && !loaded[key]) { + if (json[key]) { this.sideloadRelationships(loader, meta.type, json, key, loaded); } }, this); diff --git a/packages/ember-data/tests/integration/json_serialization_test.js b/packages/ember-data/tests/integration/json_serialization_test.js index f3325e840bd..d52b8c21ea8 100644 --- a/packages/ember-data/tests/integration/json_serialization_test.js +++ b/packages/ember-data/tests/integration/json_serialization_test.js @@ -170,3 +170,60 @@ test("the default addRelationships calls addHasMany", function() { serializer.serialize(post); }); + +test("loadValue should be called once per sideloaded type", function() { + var payload, loader, K = Ember.K, loadedTypes = [], App = Ember.Namespace.create({ + toString: function() { return "App"; } + }); + + App.Fan = DS.Model.extend({ + name: DS.attr('string') + }); + + App.Player = DS.Model.extend({ + name: DS.attr('string'), + fans: DS.hasMany(App.Fan) + }); + + App.Coach = DS.Model.extend({ + name: DS.attr('string'), + fans: DS.hasMany(App.Fan), + players: DS.hasMany(App.Player) + }); + + serializer.configure(App.Coach, { + sideloadAs: 'coaches' + }); + + App.Team = DS.Model.extend({ + name: DS.attr('string'), + mascots: DS.hasMany(App.Coach), + fans: DS.hasMany(App.Fan), + players: DS.hasMany(App.Player) + }); + + payload = { + coaches: [{ + id: 1, name: "Peter Wagenet", fans: [ 1 ], players: [ 1 ] + }], + fans: [{ + id: 1, name: "Yehuda Katz" + }], + players: [{ + id: 1, name: "Tom Dale", fans: [ 1 ] + }], + team: { + id: 1, name: "49ers", fans: [ 1 ], players: [ 1 ], coaches: [ 1 ] + } + }; + + loader = { load: K, loadMany: K, prematerialize: K, sinceForType: K }; + + serializer.loadValue = function(store, type, value) { + loadedTypes.push(type); + }; + + serializer.extract(loader, payload, App.Team); + + equal(loadedTypes.length, 3, "Loaded: " + loadedTypes.join(", ")); +});