Sideloaded saves

The latest build of Ember.

by Jeremy Gillick

HTML

<script src="http://builds.emberjs.com/handlebars-1.0.0.js"></script>
<script src="http://builds.emberjs.com/ember-latest.js"></script>
<script src="http://builds.emberjs.com/tags/v1.0.0-beta.4/ember-data.prod.js"></script>
<script type="text/x-handlebars" data-template-name="index">
    <button {{action "save"}}>Save</button>
</script>

JavaScript

App = Ember.Application.create({});

App.Child = DS.Model.extend({
    name: DS.attr('string'),
    toys: DS.hasMany('toy'),
});
App.Toy = DS.Model.extend({
    kind: DS.attr('string'),
    size: DS.belongsTo('size'),
    features: DS.hasMany('feature')
});
App.Size = DS.Model.extend({
    height: DS.attr('number'),
    width: DS.attr('number'),
    depth: DS.attr('number')
});
App.Feature = DS.Model.extend({
    name: DS.attr('string')
});

DS.RESTAdapter.reopen({
    sideloadRecord: function(store, record, data) {
        var type = record.constructor.typeKey,
            id = Ember.get(record, 'id'),
            listKey = type.pluralize(),
            itemData = {};
        
        // Create side loaded list
        if (!data[listKey]) {
            data[listKey] = [];
        }
        
        // Already side loaded
        if (data[listKey].findBy('id', id) != undefined) {
            console.log('return');
            return data;
        }
        
        data[listKey].push( record.serialize({includeId: true}) );
        this.sideloadRelationships(store, record, data);
        
        return data;
    },
    sideloadRelationships: function(store, record, data) {
        
        // Sideload relationships
        record.eachRelationship(function(key, relationship) {
            var related = Ember.get(record, key);
               
            // Belongs to
            if (relationship.kind === 'belongsTo') {
                this.sideloadRecord(store, related, data);
            } 
            // Has many
            if (related && relationship.kind === 'hasMany') {
                related.forEach(function(item, index){
                    this.sideloadRecord(store, item, data);
                }, this);
            }
        }, this);
    },
    createRecord: function(store, type, record) {
        console.log('Create');
        var data = {};
        var serializer = store.serializerFor(type.typeKey);
        
        serializer.serializeIntoHash(data,...