Skip to content

Commit d596ce6

Browse files
committed
Add 'instance.saveAssociationsByDefault' option & bump sql-query
1 parent 31bfdf8 commit d596ce6

File tree

5 files changed

+198
-76
lines changed

5 files changed

+198
-76
lines changed

Changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### v2.1.26
2+
- Add `instance.saveAssociationsByDefault` setting
3+
- Bump node-sql-query version to v0.1.26
4+
15
### v2.1.25
26
- Fix `pool` and `debug` query options boolean check (#638)
37
- Add `hasOne(field: 'userId', mapsTo: 'user_id')` option (#638)

lib/Instance.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ function Instance(Model, opts) {
3636
opts.originalKeyValues[prop.name] = opts.data[prop.name];
3737
}
3838
};
39+
var shouldSaveAssocs = function (saveOptions) {
40+
if (Model.settings.get("instance.saveAssociationsByDefault")) {
41+
return saveOptions.saveAssociations !== false;
42+
} else {
43+
return !!saveOptions.saveAssociations;
44+
}
45+
};
3946
var handleValidations = function (cb) {
4047
var pending = [], errors = [], required;
4148

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

203-
if (saveOptions.saveAssociations === false) {
210+
if (!shouldSaveAssocs(saveOptions)) {
204211
return finish();
205212
}
206213

@@ -215,10 +222,10 @@ function Instance(Model, opts) {
215222
saveInstanceExtra(cb);
216223
}
217224

218-
if(!saved && saveOptions.saveAssociations === false) {
225+
if(!saved && !shouldSaveAssocs(saveOptions)) {
219226
finish();
220227
} else {
221-
if (saveOptions.saveAssociations === false) {
228+
if (!shouldSaveAssocs(saveOptions)) {
222229
runAfterSaveActions(function () {
223230
finish();
224231
}, false);

lib/Settings.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
var _ = require('lodash');
22
var default_settings = {
33
properties : {
4-
primary_key : "id",
5-
association_key : "{name}_{field}",
6-
required : false
4+
primary_key : "id",
5+
association_key : "{name}_{field}",
6+
required : false
77
},
88
instance : {
9-
cache : true,
10-
cacheSaveCheck : true,
11-
autoSave : false,
12-
autoFetch : false,
13-
autoFetchLimit : 1,
14-
cascadeRemove : true,
15-
returnAllErrors : false
9+
cache : true,
10+
cacheSaveCheck : true,
11+
autoSave : false,
12+
autoFetch : false,
13+
autoFetchLimit : 1,
14+
cascadeRemove : true,
15+
returnAllErrors : false,
16+
saveAssociationsByDefault : true
1617
},
1718
hasMany : {
1819
// Makes the foreign key fields a composite key
19-
key : false
20+
key : false
2021
},
2122
connection : {
22-
reconnect : true,
23-
pool : false,
24-
debug : false
23+
reconnect : true,
24+
pool : false,
25+
debug : false
2526
}
2627
};
2728

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"sqlite",
1313
"mongodb"
1414
],
15-
"version" : "2.1.25",
15+
"version" : "2.1.26",
1616
"license" : "MIT",
1717
"homepage" : "http://dresende.github.io/node-orm2",
1818
"repository" : "http://github.com/dresende/node-orm2.git",
@@ -37,7 +37,7 @@
3737
"analyse" : false,
3838
"dependencies": {
3939
"enforce" : "0.1.6",
40-
"sql-query" : "0.1.25",
40+
"sql-query" : "0.1.26",
4141
"sql-ddl-sync" : "0.3.11",
4242
"hat" : "0.0.3",
4343
"lodash" : "2.4.1"

test/integration/model-save.js

Lines changed: 166 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ describe("Model.save()", function() {
1616
}, opts || {});
1717

1818
Person.hasOne("parent", Person, opts.hasOneOpts);
19+
if ('saveAssociationsByDefault' in opts) {
20+
Person.settings.set(
21+
'instance.saveAssociationsByDefault', opts.saveAssociationsByDefault
22+
);
23+
}
1924

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

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

209-
beforeEach(function (done) {
210-
function afterSave () {
211-
afterSaveCalled = true;
212-
}
213-
var hooks = { afterSave: afterSave };
214-
215-
setup(null, { hooks: hooks, cache: false, hasOneOpts: { autoFetch: true } })(function (err) {
216-
should.not.exist(err);
214+
describe("default on in settings", function () {
215+
beforeEach(function (done) {
216+
function afterSave () {
217+
afterSaveCalled = true;
218+
}
219+
var hooks = { afterSave: afterSave };
217220

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

221-
should.exist(olga);
222-
Person.create({ name: 'Hagar', parent_id: olga.id }, function (err, hagar) {
224+
Person.create({ name: 'Olga' }, function (err, olga) {
223225
should.not.exist(err);
224-
should.exist(hagar);
225-
afterSaveCalled = false;
226-
done();
226+
227+
should.exist(olga);
228+
Person.create({ name: 'Hagar', parent_id: olga.id }, function (err, hagar) {
229+
should.not.exist(err);
230+
should.exist(hagar);
231+
afterSaveCalled = false;
232+
done();
233+
});
227234
});
228235
});
229236
});
230-
});
231237

232-
it("off should not save associations but save itself", function (done) {
233-
Person.one({ name: 'Hagar' }, function (err, hagar) {
234-
should.not.exist(err);
235-
should.exist(hagar.parent);
238+
it("should be on", function () {
239+
should.equal(Person.settings.get('instance.saveAssociationsByDefault'), true);
240+
});
236241

237-
hagar.parent.name = 'Olga2';
238-
hagar.save({name: 'Hagar2'}, { saveAssociations: false }, function (err) {
242+
it("off should not save associations but save itself", function (done) {
243+
Person.one({ name: 'Hagar' }, function (err, hagar) {
239244
should.not.exist(err);
240-
should.equal(afterSaveCalled, true);
245+
should.exist(hagar.parent);
241246

242-
Person.get(hagar.parent.id, function (err, olga) {
247+
hagar.parent.name = 'Olga2';
248+
hagar.save({name: 'Hagar2'}, { saveAssociations: false }, function (err) {
243249
should.not.exist(err);
244-
should.equal(olga.name, 'Olga');
245-
done();
250+
should.equal(afterSaveCalled, true);
251+
252+
Person.get(hagar.parent.id, function (err, olga) {
253+
should.not.exist(err);
254+
should.equal(olga.name, 'Olga');
255+
done();
256+
});
246257
});
247258
});
248259
});
249-
});
250260

251-
it("off should not save associations or itself if there are no changes", function (done) {
252-
Person.one({ name: 'Hagar' }, function (err, hagar) {
253-
should.not.exist(err);
261+
it("off should not save associations or itself if there are no changes", function (done) {
262+
Person.one({ name: 'Hagar' }, function (err, hagar) {
263+
should.not.exist(err);
264+
265+
hagar.save({}, { saveAssociations: false }, function (err) {
266+
should.not.exist(err);
267+
should.equal(afterSaveCalled, false);
254268

255-
hagar.save({}, { saveAssociations: false }, function (err) {
269+
Person.get(hagar.parent.id, function (err, olga) {
270+
should.not.exist(err);
271+
should.equal(olga.name, 'Olga');
272+
done();
273+
});
274+
});
275+
});
276+
});
277+
278+
it("unspecified should save associations and itself", function (done) {
279+
Person.one({ name: 'Hagar' }, function (err, hagar) {
256280
should.not.exist(err);
257-
should.equal(afterSaveCalled, false);
281+
should.exist(hagar.parent);
258282

259-
Person.get(hagar.parent.id, function (err, olga) {
283+
hagar.parent.name = 'Olga2';
284+
hagar.save({name: 'Hagar2'}, function (err) {
260285
should.not.exist(err);
261-
should.equal(olga.name, 'Olga');
262-
done();
286+
287+
Person.get(hagar.parent.id, function (err, olga) {
288+
should.not.exist(err);
289+
should.equal(olga.name, 'Olga2');
290+
291+
Person.get(hagar.id, function (err, person) {
292+
should.not.exist(err);
293+
should.equal(person.name, 'Hagar2');
294+
295+
done();
296+
});
297+
});
298+
});
299+
});
300+
});
301+
302+
it("on should save associations and itself", function (done) {
303+
Person.one({ name: 'Hagar' }, function (err, hagar) {
304+
should.not.exist(err);
305+
should.exist(hagar.parent);
306+
307+
hagar.parent.name = 'Olga2';
308+
hagar.save({name: 'Hagar2'}, { saveAssociations: true }, function (err) {
309+
should.not.exist(err);
310+
311+
Person.get(hagar.parent.id, function (err, olga) {
312+
should.not.exist(err);
313+
should.equal(olga.name, 'Olga2');
314+
315+
Person.get(hagar.id, function (err, person) {
316+
should.not.exist(err);
317+
should.equal(person.name, 'Hagar2');
318+
319+
done();
320+
});
321+
});
263322
});
264323
});
265324
});
266325
});
267326

268-
it("unspecified should save associations and itself", function (done) {
269-
Person.one({ name: 'Hagar' }, function (err, hagar) {
270-
should.not.exist(err);
271-
should.exist(hagar.parent);
327+
describe("turned off in settings", function () {
328+
beforeEach(function (done) {
329+
function afterSave () {
330+
afterSaveCalled = true;
331+
}
332+
var hooks = { afterSave: afterSave };
272333

273-
hagar.parent.name = 'Olga2';
274-
hagar.save({name: 'Hagar2'}, function (err) {
334+
setup(null, {
335+
hooks: hooks, cache: false, hasOneOpts: { autoFetch: true },
336+
saveAssociationsByDefault: false
337+
})(function (err) {
275338
should.not.exist(err);
276339

277-
Person.get(hagar.parent.id, function (err, olga) {
340+
Person.create({ name: 'Olga' }, function (err, olga) {
278341
should.not.exist(err);
279-
should.equal(olga.name, 'Olga2');
280342

281-
Person.get(hagar.id, function (err, person) {
343+
should.exist(olga);
344+
Person.create({ name: 'Hagar', parent_id: olga.id }, function (err, hagar) {
282345
should.not.exist(err);
283-
should.equal(person.name, 'Hagar2');
284-
346+
should.exist(hagar);
347+
afterSaveCalled = false;
285348
done();
286349
});
287350
});
288351
});
289352
});
290-
});
291353

292-
it("on should save associations and itself", function (done) {
293-
Person.one({ name: 'Hagar' }, function (err, hagar) {
294-
should.not.exist(err);
295-
should.exist(hagar.parent);
354+
it("should be off", function () {
355+
should.equal(Person.settings.get('instance.saveAssociationsByDefault'), false);
356+
});
296357

297-
hagar.parent.name = 'Olga2';
298-
hagar.save({name: 'Hagar2'}, { saveAssociations: true }, function (err) {
358+
it("unspecified should not save associations but save itself", function (done) {
359+
Person.one({ name: 'Hagar' }, function (err, hagar) {
299360
should.not.exist(err);
361+
should.exist(hagar.parent);
300362

301-
Person.get(hagar.parent.id, function (err, olga) {
363+
hagar.parent.name = 'Olga2';
364+
hagar.save({ name: 'Hagar2' }, function (err) {
302365
should.not.exist(err);
303-
should.equal(olga.name, 'Olga2');
304366

305-
Person.get(hagar.id, function (err, person) {
367+
Person.get(hagar.parent.id, function (err, olga) {
306368
should.not.exist(err);
307-
should.equal(person.name, 'Hagar2');
369+
should.equal(olga.name, 'Olga');
370+
371+
Person.get(hagar.id, function (err, person) {
372+
should.not.exist(err);
373+
should.equal(person.name, 'Hagar2');
374+
375+
done();
376+
});
377+
});
378+
});
379+
});
380+
});
308381

382+
it("off should not save associations but save itself", function (done) {
383+
Person.one({ name: 'Hagar' }, function (err, hagar) {
384+
should.not.exist(err);
385+
should.exist(hagar.parent);
386+
387+
hagar.parent.name = 'Olga2';
388+
hagar.save({ name: 'Hagar2' }, { saveAssociations: false }, function (err) {
389+
should.not.exist(err);
390+
should.equal(afterSaveCalled, true);
391+
392+
Person.get(hagar.parent.id, function (err, olga) {
393+
should.not.exist(err);
394+
should.equal(olga.name, 'Olga');
309395
done();
310396
});
311397
});
312398
});
313399
});
400+
401+
it("on should save associations and itself", function (done) {
402+
Person.one({ name: 'Hagar' }, function (err, hagar) {
403+
should.not.exist(err);
404+
should.exist(hagar.parent);
405+
406+
hagar.parent.name = 'Olga2';
407+
hagar.save({ name: 'Hagar2' }, { saveAssociations: true }, function (err) {
408+
should.not.exist(err);
409+
410+
Person.get(hagar.parent.id, function (err, olga) {
411+
should.not.exist(err);
412+
should.equal(olga.name, 'Olga2');
413+
414+
Person.get(hagar.id, function (err, person) {
415+
should.not.exist(err);
416+
should.equal(person.name, 'Hagar2');
417+
418+
done();
419+
});
420+
});
421+
});
422+
});
423+
});
314424
});
315425
});
316426

0 commit comments

Comments
 (0)