diff --git a/lib/relation-definition.js b/lib/relation-definition.js index 2590a3a5..952af939 100644 --- a/lib/relation-definition.js +++ b/lib/relation-definition.js @@ -1534,20 +1534,32 @@ HasMany.prototype.create = function (targetModelData, cb) { var fk = this.definition.keyTo; var pk = this.definition.keyFrom; var modelInstance = this.modelInstance; - + if (typeof targetModelData === 'function' && !cb) { cb = targetModelData; targetModelData = {}; } targetModelData = targetModelData || {}; - targetModelData[fk] = modelInstance[pk]; - - this.definition.applyProperties(modelInstance, targetModelData); - + + var fkAndProps = function(item) { + item[fk] = modelInstance[pk]; + self.definition.applyProperties(modelInstance, item); + }; + + var apply = function(data, fn) { + if (Array.isArray(data)) { + data.forEach(fn); + } else { + fn(data); + } + }; + + apply(targetModelData, fkAndProps); + modelTo.create(targetModelData, function(err, targetModel) { if(!err) { - // Refresh the cache - self.addToCache(targetModel); + //Refresh the cache + apply(targetModel, self.addToCache.bind(self)); cb && cb(err, targetModel); } else { cb && cb(err); diff --git a/test/relations.test.js b/test/relations.test.js index ea42176b..7b9718ea 100644 --- a/test/relations.test.js +++ b/test/relations.test.js @@ -87,6 +87,25 @@ describe('relations', function () { }); }); + it('should create a batch of records on scope', function (done) { + var chapters = [ + {name: 'a'}, + {name: 'z'}, + {name: 'c'} + ]; + Book.create(function (err, book) { + book.chapters.create(chapters, function (err, chs) { + should.not.exist(err); + should.exist(chs); + chs.should.have.lengthOf(chapters.length); + chs.forEach(function(c) { + c.bookId.should.equal(book.id); + }); + done(); + }); + }); + }); + it('should fetch all scoped instances', function (done) { Book.create(function (err, book) { book.chapters.create({name: 'a'}, function () {