diff --git a/lib/services/model/applyHooks.js b/lib/services/model/applyHooks.js index de6c0a82597..eb85bce4657 100644 --- a/lib/services/model/applyHooks.js +++ b/lib/services/model/applyHooks.js @@ -28,6 +28,7 @@ function applyHooks(model, schema) { if (childModel.$appliedHooks) { continue; } + applyHooks(childModel, schema.childSchemas[i].schema); if (childModel.discriminators != null) { keys = Object.keys(childModel.discriminators); for (j = 0; j < keys.length; ++j) { @@ -35,7 +36,6 @@ function applyHooks(model, schema) { childModel.discriminators[keys[j]].schema); } } - applyHooks(childModel, schema.childSchemas[i].schema); } if (!q.length) { diff --git a/test/docs/discriminators.test.js b/test/docs/discriminators.test.js index f00d12e8fbf..fb4bac84f6a 100644 --- a/test/docs/discriminators.test.js +++ b/test/docs/discriminators.test.js @@ -352,4 +352,56 @@ describe('discriminator docs', function () { }). catch(done); }); + + /** + * Recursive embedded discriminators + */ + it('Recursive embedded discriminators in arrays', function(done) { + var singleEventSchema = new Schema({ message: String }, + { discriminatorKey: 'kind', _id: false }); + + var eventListSchema = new Schema({ events: [singleEventSchema] }); + + var subEventSchema = new Schema({ + sub_events: [singleEventSchema] + }, { _id: false }); + + var SubEvent = subEventSchema.path('sub_events').discriminator('SubEvent', subEventSchema) + eventListSchema.path('events').discriminator('SubEvent', subEventSchema); + + var Eventlist = db.model('EventList', eventListSchema); + + // Create a new batch of events with different kinds + var list = { + events: [ + { kind: 'SubEvent', sub_events: [{kind:'SubEvent', sub_events:[], message:'test1'}], message: 'hello' }, + { kind: 'SubEvent', sub_events: [{kind:'SubEvent', sub_events:[{kind:'SubEvent', sub_events:[], message:'test3'}], message:'test2'}], message: 'world' } + ] + }; + + Eventlist.create(list). + then(function(doc) { + assert.equal(doc.events.length, 2); + + assert.equal(doc.events[0].sub_events[0].message, 'test1'); + assert.equal(doc.events[0].message, 'hello'); + assert.ok(doc.events[0].sub_events[0] instanceof SubEvent); + + assert.equal(doc.events[1].sub_events[0].sub_events[0].message, 'test3'); + assert.equal(doc.events[1].message, 'world'); + assert.ok(doc.events[1].sub_events[0].sub_events[0] instanceof SubEvent); + + doc.events.push({kind:'SubEvent', sub_events:[{kind:'SubEvent', sub_events:[], message:'test4'}], message:'pushed'}); + return doc.save(); + }). + then(function(doc) { + assert.equal(doc.events.length, 3); + + assert.equal(doc.events[2].message, 'pushed'); + assert.ok(doc.events[2].sub_events[0] instanceof SubEvent); + + done(); + }). + catch(done); + }); });