Skip to content

Commit 8f5e28c

Browse files
author
Lee Richmond
committed
Fix record unloading logic
1 parent 92cf580 commit 8f5e28c

File tree

6 files changed

+37
-19
lines changed

6 files changed

+37
-19
lines changed

addon/mixins/model.js

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
import Ember from 'ember';
22

3-
const resetRelations = function(record, relationshipsDirective) {
4-
record.eachRelationship((relationName, meta) => {
5-
if (meta.kind === 'hasMany') {
6-
if (relationshipsDirective.hasOwnProperty(relationName)) {
7-
let filtered = record.get(relationName).filter((r) => {
8-
return r.get('isNew') ||
9-
r.get('markedForDestruction') ||
10-
r.get('markedForDeletion');
11-
});
12-
record.get(relationName).removeObjects(filtered);
13-
}
3+
const resetRelations = function(record) {
4+
record.get('__recordsJustSaved').forEach((r) => {
5+
let shouldUnload = r.get('isNew') || r.get('markedForDestruction') || r.get('markedForDeletion');
6+
if (shouldUnload) {
7+
r.unloadRecord();
148
}
159
});
10+
record.set('__recordsJustSaved', []);
1611
};
1712

1813
const defaultOptions = function(options) {
@@ -49,12 +44,7 @@ export default Ember.Mixin.create({
4944
save(options = {}) {
5045
defaultOptions(options);
5146
let promise = this._super(...arguments);
52-
53-
let directive = options.adapterOptions.relationships;
54-
promise.then((record) => {
55-
resetRelations(record, directive);
56-
});
57-
47+
promise.then(resetRelations);
5848
return promise;
5949
}
6050
});

addon/mixins/nested-relations.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import Ember from 'ember';
22

3+
// This is for reference in our post-save promise
4+
// We need to unload these records after save, otherwise
5+
// we will be left with 2 of the same object - one persisted
6+
// and one not.
7+
// This is only required for hasMany's
8+
let savedRecords = [];
9+
310
const iterateRelations = function(record, relations, callback) {
411
Object.keys(relations).forEach((relationName) => {
512
let subRelations = relations[relationName];
@@ -71,6 +78,7 @@ const hasManyData = function(relatedRecords, subRelations) {
7178
let payload = jsonapiPayload(relatedRecord);
7279
processRelationships(subRelations, payload, relatedRecord);
7380
payloads.push(payload);
81+
savedRecords.push(relatedRecord);
7482
});
7583
return { data: payloads };
7684
};
@@ -131,6 +139,7 @@ const relationshipsDirective = function(value) {
131139

132140
export default Ember.Mixin.create({
133141
serialize(snapshot/*, options */) {
142+
savedRecords = [];
134143
let json = this._super(...arguments);
135144
delete(json.data.relationships);
136145
delete(json.data.attributes);
@@ -152,6 +161,7 @@ export default Ember.Mixin.create({
152161

153162
let relationships = relationshipsDirective(adapterOptions.relationships);
154163
processRelationships(relationships, json.data, snapshot.record);
164+
snapshot.record.set('__recordsJustSaved', savedRecords);
155165
console.log('serialized', json);
156166
return json;
157167
}

tests/acceptance/create-nested-relations-test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ test('creating a record with nested relations', function(assert) {
1919
andThen(function() {
2020
assert.equal(detailPage.title, 'my post', 'saves basic attributes correctly');
2121
assert.equal(detailPage.tagList, 'new tag 1, new tag 2', 'saves one-to-many correctly');
22+
assert.equal(detailPage.tagIds, '1, 2', 'maintains one-to-many ids correctly');
2223
assert.equal(detailPage.authorName, 'John Doe', 'saves one-to-one correctly');
24+
assert.equal(detailPage.authorId, '1', 'maintains one-to-one ids correctly');
2325
});
2426
});

tests/dummy/app/models/post.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,9 @@ export default DS.Model.extend(ModelMixin, {
1010

1111
tagNames: Ember.computed('[email protected]', function() {
1212
return this.get('tags').mapBy('name').join(', ');
13+
}),
14+
15+
tagIds: Ember.computed('[email protected]', function() {
16+
return this.get('tags').mapBy('id').join(', ');
1317
})
1418
});

tests/dummy/app/post/template.hbs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,20 @@
1919
<span>{{model.author.name}}</span>
2020
</div>
2121

22-
<div class='tags'>
22+
<div class='author-id'>
23+
<label>Author ID:</label>
24+
<span>{{model.author.id}}</span>
25+
</div>
26+
27+
<div class='tag-names'>
2328
<label>Tags:</label>
2429
<span>{{model.tagNames}}</span>
2530
</div>
31+
32+
<div class='tag-ids'>
33+
<label>Tags:</label>
34+
<span>{{model.tagIds}}</span>
35+
</div>
2636
</div>
2737
</div>
2838
</div>

tests/pages/show-post.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ export default create({
99
visit: visitable('/posts/:id'),
1010
title: text('.title span'),
1111
authorName: text('.author-name span'),
12+
authorId: text('.author-id span'),
1213

13-
tagList: text('.tags span'),
14+
tagList: text('.tag-names span'),
15+
tagIds: text('.tag-ids span'),
1416

1517
edit: clickable('.edit')
1618
});

0 commit comments

Comments
 (0)