Merge pull request #616 from clarkbw/defaultfn-upsert

default values are being overwritten in upsert
This commit is contained in:
Raymond Feng 2015-07-14 10:35:20 -07:00
commit 01af886c7d
5 changed files with 45 additions and 6 deletions

View File

@ -238,6 +238,7 @@ Memory.prototype.updateOrCreate = function (model, data, options, callback) {
}; };
Memory.prototype.save = function save(model, data, options, callback) { Memory.prototype.save = function save(model, data, options, callback) {
var self = this;
var id = this.getIdValue(model, data); var id = this.getIdValue(model, data);
var cachedModels = this.collection(model); var cachedModels = this.collection(model);
var modelData = cachedModels && this.collection(model)[id]; var modelData = cachedModels && this.collection(model)[id];
@ -247,7 +248,7 @@ Memory.prototype.save = function save(model, data, options, callback) {
} }
this.collection(model)[id] = serialize(data); this.collection(model)[id] = serialize(data);
this.saveToFile(data, function(err) { this.saveToFile(data, function(err) {
callback(err, data, { isNewInstance: !modelData }); callback(err, self.fromDb(model, data), { isNewInstance: !modelData });
}); });
}; };

View File

@ -445,8 +445,8 @@ DataAccessObject.updateOrCreate = DataAccessObject.upsert = function upsert(data
data = ctx.data; data = ctx.data;
var update = data; var update = data;
var inst = data; var inst = data;
if(!(data instanceof Model)) { if (!(data instanceof Model)) {
inst = new Model(data); inst = new Model(data, { applyDefaultValues: false });
} }
update = inst.toObject(false); update = inst.toObject(false);

View File

@ -43,6 +43,9 @@ function ModelBaseClass(data, options) {
// Default to true // Default to true
options.applySetters = true; options.applySetters = true;
} }
if (!('applyDefaultValues' in options)) {
options.applyDefaultValues = true;
}
this._initProperties(data, options); this._initProperties(data, options);
} }
@ -51,6 +54,7 @@ function ModelBaseClass(data, options) {
* @param {Object} data The data object * @param {Object} data The data object
* @param {Object} options An object to control the instantiation * @param {Object} options An object to control the instantiation
* @property {Boolean} applySetters Controls if the setters will be applied * @property {Boolean} applySetters Controls if the setters will be applied
* @property {Boolean} applyDefaultValues Default attributes and values will be applied
* @property {Boolean} strict Set the instance level strict mode * @property {Boolean} strict Set the instance level strict mode
* @property {Boolean} persisted Whether the instance has been persisted * @property {Boolean} persisted Whether the instance has been persisted
* @private * @private
@ -72,6 +76,7 @@ ModelBaseClass.prototype._initProperties = function (data, options) {
options = options || {}; options = options || {};
var applySetters = options.applySetters; var applySetters = options.applySetters;
var applyDefaultValues = options.applyDefaultValues;
var strict = options.strict; var strict = options.strict;
if(strict === undefined) { if(strict === undefined) {
@ -243,7 +248,7 @@ ModelBaseClass.prototype._initProperties = function (data, options) {
var type = properties[p].type; var type = properties[p].type;
// Set default values // Set default values
if (propVal === undefined) { if (applyDefaultValues && propVal === undefined) {
var def = properties[p]['default']; var def = properties[p]['default'];
if (def !== undefined) { if (def !== undefined) {
if (typeof def === 'function') { if (typeof def === 'function') {
@ -265,7 +270,7 @@ ModelBaseClass.prototype._initProperties = function (data, options) {
} }
// Set default value using a named function // Set default value using a named function
if (propVal === undefined) { if (applyDefaultValues && propVal === undefined) {
var defn = properties[p].defaultFn; var defn = properties[p].defaultFn;
switch (defn) { switch (defn) {
case undefined: case undefined:

View File

@ -9,7 +9,8 @@ describe('defaults', function () {
before(function () { before(function () {
Server = db.define('Server', { Server = db.define('Server', {
host: String, host: String,
port: {type: Number, default: 80} port: {type: Number, default: 80},
createdAt: {type: Date, default: '$now'}
}); });
}); });
@ -49,4 +50,23 @@ describe('defaults', function () {
}); });
}); });
it('should apply defaults in upsert create', function (done) {
Server.upsert({port: 8181 }, function(err, server) {
should.not.exist(err);
should.exist(server.createdAt);
done();
});
});
it('should preserve defaults in upsert update', function (done) {
Server.findOne({}, function(err, server) {
Server.upsert({id:server.id, port: 1337 }, function(err, s) {
should.not.exist(err);
(Number(1337)).should.equal(s.port);
server.createdAt.should.eql(s.createdAt);
done();
});
});
});
}); });

View File

@ -389,6 +389,19 @@ describe('Memory connector', function() {
}); });
}); });
it('should deserialize values after saving in upsert', function(done) {
User.findOne({where: {seq: 1}}, function(err, paul) {
User.updateOrCreate({id: paul.id, name: 'Sir Paul McCartney'},
function(err, sirpaul) {
should.not.exist(err);
sirpaul.birthday.should.be.instanceOf(Date);
sirpaul.order.should.be.instanceOf(Number);
sirpaul.vip.should.be.instanceOf(Boolean);
done();
});
});
});
function seed(done) { function seed(done) {
var beatles = [ var beatles = [
{ {