Skip to content

Commit

Permalink
Add 'instance.saveAssociationsByDefault' option & bump sql-query
Browse files Browse the repository at this point in the history
  • Loading branch information
dxg committed May 28, 2015
1 parent 31bfdf8 commit d596ce6
Show file tree
Hide file tree
Showing 5 changed files with 198 additions and 76 deletions.
4 changes: 4 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
### v2.1.26
- Add `instance.saveAssociationsByDefault` setting
- Bump node-sql-query version to v0.1.26

### v2.1.25
- Fix `pool` and `debug` query options boolean check (#638)
- Add `hasOne(field: 'userId', mapsTo: 'user_id')` option (#638)
Expand Down
15 changes: 11 additions & 4 deletions lib/Instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ function Instance(Model, opts) {
opts.originalKeyValues[prop.name] = opts.data[prop.name];
}
};
var shouldSaveAssocs = function (saveOptions) {
if (Model.settings.get("instance.saveAssociationsByDefault")) {
return saveOptions.saveAssociations !== false;
} else {
return !!saveOptions.saveAssociations;
}
};
var handleValidations = function (cb) {
var pending = [], errors = [], required;

Expand Down Expand Up @@ -94,7 +101,7 @@ function Instance(Model, opts) {
// - If the instance is in state mode
// - AND it's not an association that is asking it to save
// -> return has already saved
if (instance_saving && !(saveOptions.saveAssociations === false)) {
if (instance_saving && saveOptions.saveAssociations !== false) {
return cb(null, instance);
}
instance_saving = true;
Expand Down Expand Up @@ -200,7 +207,7 @@ function Instance(Model, opts) {
opts.is_new = false;
rememberKeys();

if (saveOptions.saveAssociations === false) {
if (!shouldSaveAssocs(saveOptions)) {
return finish();
}

Expand All @@ -215,10 +222,10 @@ function Instance(Model, opts) {
saveInstanceExtra(cb);
}

if(!saved && saveOptions.saveAssociations === false) {
if(!saved && !shouldSaveAssocs(saveOptions)) {
finish();
} else {
if (saveOptions.saveAssociations === false) {
if (!shouldSaveAssocs(saveOptions)) {
runAfterSaveActions(function () {
finish();
}, false);
Expand Down
29 changes: 15 additions & 14 deletions lib/Settings.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
var _ = require('lodash');
var default_settings = {
properties : {
primary_key : "id",
association_key : "{name}_{field}",
required : false
primary_key : "id",
association_key : "{name}_{field}",
required : false
},
instance : {
cache : true,
cacheSaveCheck : true,
autoSave : false,
autoFetch : false,
autoFetchLimit : 1,
cascadeRemove : true,
returnAllErrors : false
cache : true,
cacheSaveCheck : true,
autoSave : false,
autoFetch : false,
autoFetchLimit : 1,
cascadeRemove : true,
returnAllErrors : false,
saveAssociationsByDefault : true
},
hasMany : {
// Makes the foreign key fields a composite key
key : false
key : false
},
connection : {
reconnect : true,
pool : false,
debug : false
reconnect : true,
pool : false,
debug : false
}
};

Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"sqlite",
"mongodb"
],
"version" : "2.1.25",
"version" : "2.1.26",
"license" : "MIT",
"homepage" : "http://dresende.github.io/node-orm2",
"repository" : "http://github.com/dresende/node-orm2.git",
Expand All @@ -37,7 +37,7 @@
"analyse" : false,
"dependencies": {
"enforce" : "0.1.6",
"sql-query" : "0.1.25",
"sql-query" : "0.1.26",
"sql-ddl-sync" : "0.3.11",
"hat" : "0.0.3",
"lodash" : "2.4.1"
Expand Down
222 changes: 166 additions & 56 deletions test/integration/model-save.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ describe("Model.save()", function() {
}, opts || {});

Person.hasOne("parent", Person, opts.hasOneOpts);
if ('saveAssociationsByDefault' in opts) {
Person.settings.set(
'instance.saveAssociationsByDefault', opts.saveAssociationsByDefault
);
}

return helper.dropSync(Person, done);
};
Expand Down Expand Up @@ -206,111 +211,216 @@ describe("Model.save()", function() {

if (common.protocol() == 'mongodb') return;

beforeEach(function (done) {
function afterSave () {
afterSaveCalled = true;
}
var hooks = { afterSave: afterSave };

setup(null, { hooks: hooks, cache: false, hasOneOpts: { autoFetch: true } })(function (err) {
should.not.exist(err);
describe("default on in settings", function () {
beforeEach(function (done) {
function afterSave () {
afterSaveCalled = true;
}
var hooks = { afterSave: afterSave };

Person.create({ name: 'Olga' }, function (err, olga) {
setup(null, { hooks: hooks, cache: false, hasOneOpts: { autoFetch: true } })(function (err) {
should.not.exist(err);

should.exist(olga);
Person.create({ name: 'Hagar', parent_id: olga.id }, function (err, hagar) {
Person.create({ name: 'Olga' }, function (err, olga) {
should.not.exist(err);
should.exist(hagar);
afterSaveCalled = false;
done();

should.exist(olga);
Person.create({ name: 'Hagar', parent_id: olga.id }, function (err, hagar) {
should.not.exist(err);
should.exist(hagar);
afterSaveCalled = false;
done();
});
});
});
});
});

it("off should not save associations but save itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.exist(hagar.parent);
it("should be on", function () {
should.equal(Person.settings.get('instance.saveAssociationsByDefault'), true);
});

hagar.parent.name = 'Olga2';
hagar.save({name: 'Hagar2'}, { saveAssociations: false }, function (err) {
it("off should not save associations but save itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.equal(afterSaveCalled, true);
should.exist(hagar.parent);

Person.get(hagar.parent.id, function (err, olga) {
hagar.parent.name = 'Olga2';
hagar.save({name: 'Hagar2'}, { saveAssociations: false }, function (err) {
should.not.exist(err);
should.equal(olga.name, 'Olga');
done();
should.equal(afterSaveCalled, true);

Person.get(hagar.parent.id, function (err, olga) {
should.not.exist(err);
should.equal(olga.name, 'Olga');
done();
});
});
});
});
});

it("off should not save associations or itself if there are no changes", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
it("off should not save associations or itself if there are no changes", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);

hagar.save({}, { saveAssociations: false }, function (err) {
should.not.exist(err);
should.equal(afterSaveCalled, false);

hagar.save({}, { saveAssociations: false }, function (err) {
Person.get(hagar.parent.id, function (err, olga) {
should.not.exist(err);
should.equal(olga.name, 'Olga');
done();
});
});
});
});

it("unspecified should save associations and itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.equal(afterSaveCalled, false);
should.exist(hagar.parent);

Person.get(hagar.parent.id, function (err, olga) {
hagar.parent.name = 'Olga2';
hagar.save({name: 'Hagar2'}, function (err) {
should.not.exist(err);
should.equal(olga.name, 'Olga');
done();

Person.get(hagar.parent.id, function (err, olga) {
should.not.exist(err);
should.equal(olga.name, 'Olga2');

Person.get(hagar.id, function (err, person) {
should.not.exist(err);
should.equal(person.name, 'Hagar2');

done();
});
});
});
});
});

it("on should save associations and itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.exist(hagar.parent);

hagar.parent.name = 'Olga2';
hagar.save({name: 'Hagar2'}, { saveAssociations: true }, function (err) {
should.not.exist(err);

Person.get(hagar.parent.id, function (err, olga) {
should.not.exist(err);
should.equal(olga.name, 'Olga2');

Person.get(hagar.id, function (err, person) {
should.not.exist(err);
should.equal(person.name, 'Hagar2');

done();
});
});
});
});
});
});

it("unspecified should save associations and itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.exist(hagar.parent);
describe("turned off in settings", function () {
beforeEach(function (done) {
function afterSave () {
afterSaveCalled = true;
}
var hooks = { afterSave: afterSave };

hagar.parent.name = 'Olga2';
hagar.save({name: 'Hagar2'}, function (err) {
setup(null, {
hooks: hooks, cache: false, hasOneOpts: { autoFetch: true },
saveAssociationsByDefault: false
})(function (err) {
should.not.exist(err);

Person.get(hagar.parent.id, function (err, olga) {
Person.create({ name: 'Olga' }, function (err, olga) {
should.not.exist(err);
should.equal(olga.name, 'Olga2');

Person.get(hagar.id, function (err, person) {
should.exist(olga);
Person.create({ name: 'Hagar', parent_id: olga.id }, function (err, hagar) {
should.not.exist(err);
should.equal(person.name, 'Hagar2');

should.exist(hagar);
afterSaveCalled = false;
done();
});
});
});
});
});

it("on should save associations and itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.exist(hagar.parent);
it("should be off", function () {
should.equal(Person.settings.get('instance.saveAssociationsByDefault'), false);
});

hagar.parent.name = 'Olga2';
hagar.save({name: 'Hagar2'}, { saveAssociations: true }, function (err) {
it("unspecified should not save associations but save itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.exist(hagar.parent);

Person.get(hagar.parent.id, function (err, olga) {
hagar.parent.name = 'Olga2';
hagar.save({ name: 'Hagar2' }, function (err) {
should.not.exist(err);
should.equal(olga.name, 'Olga2');

Person.get(hagar.id, function (err, person) {
Person.get(hagar.parent.id, function (err, olga) {
should.not.exist(err);
should.equal(person.name, 'Hagar2');
should.equal(olga.name, 'Olga');

Person.get(hagar.id, function (err, person) {
should.not.exist(err);
should.equal(person.name, 'Hagar2');

done();
});
});
});
});
});

it("off should not save associations but save itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.exist(hagar.parent);

hagar.parent.name = 'Olga2';
hagar.save({ name: 'Hagar2' }, { saveAssociations: false }, function (err) {
should.not.exist(err);
should.equal(afterSaveCalled, true);

Person.get(hagar.parent.id, function (err, olga) {
should.not.exist(err);
should.equal(olga.name, 'Olga');
done();
});
});
});
});

it("on should save associations and itself", function (done) {
Person.one({ name: 'Hagar' }, function (err, hagar) {
should.not.exist(err);
should.exist(hagar.parent);

hagar.parent.name = 'Olga2';
hagar.save({ name: 'Hagar2' }, { saveAssociations: true }, function (err) {
should.not.exist(err);

Person.get(hagar.parent.id, function (err, olga) {
should.not.exist(err);
should.equal(olga.name, 'Olga2');

Person.get(hagar.id, function (err, person) {
should.not.exist(err);
should.equal(person.name, 'Hagar2');

done();
});
});
});
});
});
});
});

Expand Down

0 comments on commit d596ce6

Please sign in to comment.