diff --git a/packages/-ember-data/tests/integration/identifiers/polymorphic-scenarios-test.ts b/packages/-ember-data/tests/integration/identifiers/polymorphic-scenarios-test.ts index a24244052ca..2e21124037d 100644 --- a/packages/-ember-data/tests/integration/identifiers/polymorphic-scenarios-test.ts +++ b/packages/-ember-data/tests/integration/identifiers/polymorphic-scenarios-test.ts @@ -61,7 +61,34 @@ module('Integration | Identifiers - single-table-inheritance polymorphic scenari store = owner.lookup('service:store'); }); - test(`Identity of polymorphic relations can change type`, async function(assert) { + test(`Identity of polymorphic relations can change type on first load`, async function(assert) { + const { owner } = this; + class TestAdapter extends Adapter { + shouldBackgroundReloadRecord() { + return false; + } + findRecord(_, __, id) { + return resolve({ + data: { + id, + type: 'ferrari', + attributes: { + color: 'red', + }, + }, + }); + } + } + owner.register('adapter:application', TestAdapter); + + const foundFerrari = await store.findRecord('car', '1'); + assert.strictEqual(foundFerrari.constructor.modelName, 'ferrari', 'We found the right type'); + + const cachedFerrari = await store.peekRecord('ferrari', '1'); + assert.strictEqual(cachedFerrari.constructor.modelName, 'ferrari', 'We cached the right type'); + }); + + test(`Identity of polymorphic relations can change type when in cache`, async function(assert) { const { owner } = this; const requests: RID[] = []; const expectedRequests = [ diff --git a/packages/store/addon/-private/system/core-store.ts b/packages/store/addon/-private/system/core-store.ts index 0397ddfaa7d..e6f0ae63e08 100644 --- a/packages/store/addon/-private/system/core-store.ts +++ b/packages/store/addon/-private/system/core-store.ts @@ -1198,7 +1198,8 @@ abstract class CoreStore extends Service { return promise.then( payload => { // ensure that regardless of id returned we assign to the correct record - if (payload.data && !Array.isArray(payload.data)) { + // for polymorphic, if type does not match, we'll need a new identifier + if (payload.data && !Array.isArray(payload.data) && payload.data.type === identifier.type) { payload.data.lid = identifier.lid; } diff --git a/packages/store/addon/-private/system/store/finders.js b/packages/store/addon/-private/system/store/finders.js index 93278f44197..397845f3c93 100644 --- a/packages/store/addon/-private/system/store/finders.js +++ b/packages/store/addon/-private/system/store/finders.js @@ -59,7 +59,10 @@ export function _find(adapter, store, modelClass, id, internalModel, options) { ); // ensure that regardless of id returned we assign to the correct record - payload.data.lid = identifier.lid; + // for polymorphic, if type does not match, we'll need a new identifier + if (payload.data.type === identifier.type) { + payload.data.lid = identifier.lid; + } return store._push(payload); },