diff --git a/lib/model.js b/lib/model.js index 8a278a4..307a9f4 100644 --- a/lib/model.js +++ b/lib/model.js @@ -122,25 +122,39 @@ var Events = require('./events'), save: function () { var model = this; if (!model.idAttribute) { - throw new Error('model without declared perisitent id attribute cat not be saved'); + throw new Error('model without declared perisitent id attribute can not be saved'); } return this._rejectDestructed().then(function () { + var promise; if (model.isNew()) { - return model.ready().then(function () { + promise = model.ready().then(function () { return model.storage.insert(model); - }).then(function (id) { - model.idAttribute.set(id); - model.commit(); - model.calculate(); - return model.ready(); + }).then(function (data) { + var type = typeof data, + result; + if (type === 'object' && data !== null) { + result = data; + } else { + result = {}; + result[model.idAttribute.name] = data; + } + return result; }); + } else { - return model.ready().then(function () { + promise = model.ready().then(function () { return model.storage.update(model); - }).then(function () { - model.commit(); }); } + + return promise.then(function (data) { + if (data) { + model.set(data); + model.commit(); + model.calculate().done(); + } + return model.ready(); + }); }); }, diff --git a/test/models/persistent-with-updates.js b/test/models/persistent-with-updates.js new file mode 100644 index 0000000..579e1ad --- /dev/null +++ b/test/models/persistent-with-updates.js @@ -0,0 +1,38 @@ +var Model = require('../../lib/model'), + Vow = require('vow'), + storage = [], + prepareData; + +prepareData = function (data) { + data.a = data.a + '_'; + return data; +}; + +module.exports = Model.inherit({ + attributes: { + id: Model.attributeTypes.Id, + a: Model.attributeTypes.String.inherit({ + default: 'a-0' + }) + }, + + storage: Model.Storage.inherit({ + insert: function(model) { + return Vow.fulfill().delay(0).then(function () { + var data = model.toJSON(); + data.id = storage.length; + storage.push(prepareData(data)); + return data; + }); + }, + + update: function(model) { + return Vow.fulfill().delay(0).then(function () { + var data = prepareData(model.toJSON()); + storage[model.getId()] = data; + return data; + }); + } + }) + +}); diff --git a/test/persistent.js b/test/persistent.js index 88bd5c8..308b35c 100644 --- a/test/persistent.js +++ b/test/persistent.js @@ -176,4 +176,30 @@ describe('Persistent', function () { }); }).done(); }); + it('should set data from storage to model on insert', function () { + var PersistenWithUpdates = require('./models/persistent-with-updates'), + model; + + model = new PersistenWithUpdates({ + a: 'a-1' + }); + return model.save().then(function () { + expect(model.get('a')).to.be.equal('a-1_'); + }); + }); + it('should set data from storage to model on update', function () { + var PersistenWithUpdates = require('./models/persistent-with-updates'), + model; + + model = new PersistenWithUpdates({ + a: 'a-1' + }); + + return model.save().then(function () { + model.set('a', 'a-2'); + return model.save().then(function () { + expect(model.get('a')).to.be.equal('a-2_'); + }); + }); + }); });