diff --git a/addon/-private/system/relationships/state/has-many.js b/addon/-private/system/relationships/state/has-many.js index 6f8e6fa4a72..eaa76da4a07 100644 --- a/addon/-private/system/relationships/state/has-many.js +++ b/addon/-private/system/relationships/state/has-many.js @@ -180,6 +180,10 @@ export default class ManyRelationship extends Relationship { } setInitialInternalModels(internalModels) { + if (!internalModels) { + return; + } + let args = [0, this.canonicalState.length].concat(internalModels); this.canonicalState.splice.apply(this.canonicalState, args); internalModels.forEach(internalModel => { diff --git a/tests/unit/model/relationships/has-many-test.js b/tests/unit/model/relationships/has-many-test.js index 9ee43d16204..d6dbc6ed962 100644 --- a/tests/unit/model/relationships/has-many-test.js +++ b/tests/unit/model/relationships/has-many-test.js @@ -276,6 +276,48 @@ test('hasMany does not notify when it is initially reified', function(assert) { }); }); +test('hasMany can be initially reified with null', function(assert) { + assert.expect(1); + + const Tag = DS.Model.extend({ + name: DS.attr('string'), + people: DS.hasMany('person', { async: false }) + }); + + const Person = DS.Model.extend({ + name: DS.attr('string'), + tag: DS.belongsTo('tag', { async: false }) + }); + + let env = setupStore({ tag: Tag, person: Person }); + let { store } = env; + + env.adapter.shouldBackgroundReloadRecord = () => false; + + run(() => { + store.push({ + data: { + type: 'tag', + id: 1, + attributes: { + name: 'whatever' + }, + relationships: { + people: { + data: null + } + } + } + }); + }); + + return run(() => { + let tag = store.peekRecord('tag', 1); + + assert.equal(tag.get('people.length'), 0, 'relationship is correct'); + }); +}); + test('hasMany tolerates reflexive self-relationships', function(assert) { assert.expect(1);