Merge pull request #352 from TorchlightSoftware/fix-create-rel

handle relationship create with [array]
This commit is contained in:
Raymond Feng 2014-11-13 09:29:27 -08:00
commit 13d08d83cc
2 changed files with 52 additions and 21 deletions

View File

@ -3,6 +3,7 @@
*/
var assert = require('assert');
var util = require('util');
var async = require('async');
var utils = require('./utils');
var i8n = require('inflection');
var defineScope = require('./scope.js').defineScope;
@ -910,25 +911,25 @@ HasManyThrough.prototype.create = function create(data, done) {
done = data;
data = {};
}
done = done || function(){};
var modelInstance = this.modelInstance;
// First create the target model
modelTo.create(data, function (err, to) {
if (err) {
return done && done(err, to);
return done(err, to);
}
// The primary key for the target model
var pk2 = definition.modelTo.definition.idName();
var keys = throughKeys(definition);
var fk1 = keys[0];
var fk2 = keys[1];
function createRelation(to, next) {
var d = {};
d[fk1] = modelInstance[definition.keyFrom];
d[fk2] = to[pk2];
definition.applyProperties(modelInstance, d);
// Then create the through model
@ -936,13 +937,20 @@ HasManyThrough.prototype.create = function create(data, done) {
if (e) {
// Undo creation of the target model
to.destroy(function () {
done && done(e);
next(e);
});
} else {
self.addToCache(to);
done && done(err, to);
next(err, to);
}
});
}
// process array or single item
if (!Array.isArray(to))
createRelation(to, done);
else
async.map(to, createRelation, done);
});
};

View File

@ -294,6 +294,29 @@ describe('relations', function () {
});
});
it('should create multiple records on scope', function (done) {
var async = require('async');
Physician.create(function (err, physician) {
physician.patients.create([{}, {}], function (err, patients) {
should.not.exist(err);
should.exist(patients);
patients.should.have.lengthOf(2);
function verifyPatient(patient, next) {
Appointment.find({where: {
physicianId: physician.id,
patientId: patient.id
}},
function(err, apps) {
should.not.exist(err);
apps.should.have.lengthOf(1);
next();
});
}
async.forEach(patients, verifyPatient, done);
});
});
});
it('should fetch all scoped instances', function (done) {
Physician.create(function (err, physician) {
physician.patients.create({name: 'a'}, function () {