From 7f8e1fecfbfb1e69061b52c9cf14d20a6f13b339 Mon Sep 17 00:00:00 2001 From: bmac Date: Thu, 23 Jul 2015 08:58:03 -0400 Subject: [PATCH] Use the correct modelClass and serializer to extract a polymorphic type when normalizing async relationships. Closes #3547 --- .../lib/serializers/rest-serializer.js | 11 ++++- .../serializers/rest-serializer-test.js | 40 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/packages/ember-data/lib/serializers/rest-serializer.js b/packages/ember-data/lib/serializers/rest-serializer.js index 768bdcd1f8e..63f7819cc41 100644 --- a/packages/ember-data/lib/serializers/rest-serializer.js +++ b/packages/ember-data/lib/serializers/rest-serializer.js @@ -239,7 +239,16 @@ var RESTSerializer = JSONSerializer.extend({ ``` */ if (isPrimary && Ember.typeOf(value) !== 'array') { - let {data, included} = this.normalize(primaryModelClass, value, prop); + var serializer, modelClass; + // Support polymorphic records in async relationships + if (value.type && store._hasModelFor(this.modelNameFromPayloadKey(value.type))) { + serializer = store.serializerFor(value.type); + modelClass = store.modelFor(value.type); + } else { + serializer = this; + modelClass = primaryModelClass; + } + let {data, included} = serializer.normalize(modelClass, value, prop); documentHash.data = data; if (included) { documentHash.included.push(...included); diff --git a/packages/ember-data/tests/integration/serializers/rest-serializer-test.js b/packages/ember-data/tests/integration/serializers/rest-serializer-test.js index fd1b6fec768..38f2ef88f06 100644 --- a/packages/ember-data/tests/integration/serializers/rest-serializer-test.js +++ b/packages/ember-data/tests/integration/serializers/rest-serializer-test.js @@ -17,7 +17,9 @@ module("integration/serializer/rest - RESTSerializer", { superVillain: DS.belongsTo('super-villain', { async: false }), name: DS.attr('string') }); - YellowMinion = EvilMinion.extend(); + YellowMinion = EvilMinion.extend({ + eyes: DS.attr('number') + }); DoomsdayDevice = DS.Model.extend({ name: DS.attr('string'), evilMinion: DS.belongsTo('evil-minion', { polymorphic: true, async: true }) @@ -461,6 +463,42 @@ test('serializeIntoHash uses payloadKeyFromModelName to normalize the payload ro }); }); +test('normalizeResponse with async polymorphic', function() { + env.registry.register('serializer:application', DS.RESTSerializer.extend({ + isNewSerializerAPI: true + })); + var store = env.store; + env.adapter.findRecord = () => { + return { + doomsdayDevices: [{ + id: 1, + name: "DeathRay", + links: { + evilMinion: '/doomsday-device/1/evil-minion' + } + }] + }; + }; + + env.adapter.findBelongsTo = () => { + return { + evilMinion: { + id: 1, + type: 'yellowMinion', + name: 'Alex', + eyes: 3 + } + }; + }; + run(function() { + store.findRecord('doomsday-device', 1).then((deathRay) => { + return deathRay.get('evilMinion'); + }).then((evilMinion) => { + equal(evilMinion.get('eyes'), 3); + }); + }); +}); + test("normalizeResponse can load secondary records of the same type without affecting the query count", function() { var jsonHash = { comments: [{ id: "1", body: "Parent Comment", root: true, children: [2, 3] }],