Skip to content

Instantly share code, notes, and snippets.

@digitalplaywright
Created December 26, 2014 20:14
Show Gist options
  • Save digitalplaywright/21f783d366299751623e to your computer and use it in GitHub Desktop.
Save digitalplaywright/21f783d366299751623e to your computer and use it in GitHub Desktop.
Start of Ember ActiveModel Serializer support for accepts_nested_attributes_for with deletion
//file app/serializers/application.js
import DS from "ember-data";
import Ember from "ember";
export default DS.ActiveModelSerializer.extend({
serializeHasMany: function (record, json, relationship) {
var key = relationship.key;
var hasManyRecords = Ember.get(record, key);
if (!hasManyRecords) { return; }
// Embed hasMany relationship if records exist
if (relationship.options.embedded === 'always') {
var embedKey = key + "_attributes";
json[embedKey] = [];
hasManyRecords.forEach(function(item){
json[embedKey].push(item.serialize({ includeId: true }));
});
this.addDeletedRecords(record, key, json[embedKey]);
this.willCommitDeletedRecords(record);
record.one('didCommit', this, 'didCommitDeletedRecords');
record.one('becameError', this, 'didFailToCommitDeletedRecords');
}
// Fallback to default serialization behavior
else {
var payloadKey = this.keyForRelationship(key, "hasMany");
json[payloadKey] = hasManyRecords.mapBy('id');
}
},
serializeBelongsTo: function(record, json, relationship) {
var key = relationship.key;
var belongsToRecord = Ember.get(record, key);
var embedKey = key + "_attributes";
if (belongsToRecord && relationship.options.embedded === 'always') {
json[embedKey] = belongsToRecord.serialize();
}
else {
return this._super(record, json, relationship);
}
},
addDeletedRecords: function (record, key, jsonArray) {
var deletedRecords = record.get(key + '.deleted');
if (deletedRecords) {
deletedRecords.forEach(function (deletedRecord) {
if (!deletedRecord.get('isNew')) {
var serialized;
if (deletedRecord.get('isSoftDeleted')) {
serialized = deletedRecord.serialize({ includeId: true });
} else {
serialized = { id: deletedRecord.get('id') };
}
serialized._destroy = true;
jsonArray.pushObject(serialized);
}
});
}
},
willCommitDeletedRecords: function (record) {
function willCommitDeletedRecord(record) {
record.send('willCommit');
}
function willCommitDeletedRecords(name) {
var deletedKey = name + '.deleted';
var deletedRecords = record.get(deletedKey);
if (deletedRecords) {
deletedRecords.forEach(willCommitDeletedRecord);
}
}
record.eachRelationship(willCommitDeletedRecords);
},
didCommitDeletedRecords: function (record) {
function didCommitDeletedRecord(record) {
record.send('didCommit');
record.unloadRecord();
}
function didCommitDeletedRecords(name) {
var deletedKey = name + '.deleted';
var deletedRecords = record.get(deletedKey);
if (deletedRecords) {
deletedRecords.forEach(didCommitDeletedRecord);
deletedRecords.clear();
}
}
record.eachRelationship(didCommitDeletedRecords);
},
didFailToCommitDeletedRecords: function (/* record */) {
},
});
//file app/models/enterprise.js showing syntax for embedding record for accepts_nested_attributes_for
```js
import DS 'ember-data';
export default DS.Model.extend({
archive: belongsTo('archive', {embedded:'always'})
});
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment