Batch create
This commit is contained in:
parent
1749782a4b
commit
0776c51994
|
@ -22,6 +22,15 @@ instance.
|
||||||
console.log(user instanceof User);
|
console.log(user instanceof User);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
When called with array of objects as first argument `Model.create` creates bunch
|
||||||
|
of records. Both `err` and `model instance` arguments passed to callback will be
|
||||||
|
arrays then. When no errors happened `err` argument will be null.
|
||||||
|
|
||||||
|
The value returned from `Model.create` depends on second argument too. In case
|
||||||
|
of Array it will return an array of instances, otherwise single instance. But be
|
||||||
|
away, this instance(s) aren't save to database yet and you have to wait until
|
||||||
|
callback called to be able to do id-sensitive stuff.
|
||||||
|
|
||||||
### Model.prototype.save([options[, callback]]);
|
### Model.prototype.save([options[, callback]]);
|
||||||
|
|
||||||
Save instance to database, options is an object {validate: true, throws: false},
|
Save instance to database, options is an object {validate: true, throws: false},
|
||||||
|
|
34
lib/model.js
34
lib/model.js
|
@ -160,7 +160,8 @@ AbstractClass.prototype.whatTypeName = function (propName) {
|
||||||
AbstractClass.create = function (data, callback) {
|
AbstractClass.create = function (data, callback) {
|
||||||
if (stillConnecting(this.schema, this, arguments)) return;
|
if (stillConnecting(this.schema, this, arguments)) return;
|
||||||
|
|
||||||
var modelName = this.modelName;
|
var Model = this;
|
||||||
|
var modelName = Model.modelName;
|
||||||
|
|
||||||
if (typeof data === 'function') {
|
if (typeof data === 'function') {
|
||||||
callback = data;
|
callback = data;
|
||||||
|
@ -171,12 +172,39 @@ AbstractClass.create = function (data, callback) {
|
||||||
callback = function () {};
|
callback = function () {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data instanceof Array) {
|
||||||
|
var instances = [];
|
||||||
|
var errors = new Array(data.length);
|
||||||
|
var gotError = false;
|
||||||
|
var wait = data.length;
|
||||||
|
if (wait === 0) callback(null, []);
|
||||||
|
|
||||||
|
var instances = data.map(function(d, i) {
|
||||||
|
return Model.create(d, function(err, inst) {
|
||||||
|
// console.log('got', i, err, inst, inst.errors);
|
||||||
|
if (err) {
|
||||||
|
errors[i] = err;
|
||||||
|
gotError = true;
|
||||||
|
}
|
||||||
|
modelCreated();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return instances;
|
||||||
|
|
||||||
|
function modelCreated() {
|
||||||
|
if (--wait === 0) {
|
||||||
|
callback(gotError ? errors : null, instances);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var obj;
|
var obj;
|
||||||
// if we come from save
|
// if we come from save
|
||||||
if (data instanceof this && !data.id) {
|
if (data instanceof Model && !data.id) {
|
||||||
obj = data;
|
obj = data;
|
||||||
} else {
|
} else {
|
||||||
obj = new this(data);
|
obj = new Model(data);
|
||||||
}
|
}
|
||||||
data = obj.toObject(true);
|
data = obj.toObject(true);
|
||||||
|
|
||||||
|
|
|
@ -79,10 +79,35 @@ describe('manipulation', function() {
|
||||||
should.exist(this.id);
|
should.exist(this.id);
|
||||||
Person.afterCreate = null;
|
Person.afterCreate = null;
|
||||||
next();
|
next();
|
||||||
setTimeout(done, 10);
|
setTimeout(done, 30);
|
||||||
};
|
};
|
||||||
Person.create();
|
Person.create();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should create batch of objects', function(done) {
|
||||||
|
var batch = [{name: 'Shaltay'}, {name: 'Boltay'}, {}];
|
||||||
|
Person.create(batch, function(e, ps) {
|
||||||
|
should.not.exist(e);
|
||||||
|
should.exist(ps);
|
||||||
|
ps.should.be.instanceOf(Array);
|
||||||
|
ps.should.have.lengthOf(batch.length);
|
||||||
|
|
||||||
|
Person.validatesPresenceOf('name');
|
||||||
|
Person.create(batch, function(errors, persons) {
|
||||||
|
delete Person._validations;
|
||||||
|
should.exist(errors);
|
||||||
|
errors.should.have.lengthOf(batch.length);
|
||||||
|
should.not.exist(errors[0]);
|
||||||
|
should.not.exist(errors[1]);
|
||||||
|
should.exist(errors[2]);
|
||||||
|
|
||||||
|
should.exist(persons);
|
||||||
|
persons.should.have.lengthOf(batch.length);
|
||||||
|
persons[0].errors.should.be.false;
|
||||||
|
done();
|
||||||
|
}).should.be.instanceOf(Array);
|
||||||
|
}).should.have.lengthOf(3);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('save', function() {
|
describe('save', function() {
|
||||||
|
|
Loading…
Reference in New Issue