How can I clone an Ember Data record, including relationships?

ember-data, ember.js

Solution

A few improvements to Daniel's answer that allows providing overrides, and clears the id for new records, to be safe. Also I prefer not to call `save` within the clone method, but leave it up to the caller.

DS.Model.reopen({
    clone: function(overrides) {
        var model = this,
            attrs = model.toJSON(),
            class_type = model.constructor;

        var root = Ember.String.decamelize(class_type.toString().split('.')[1]);

        /*
         * Need to replace the belongsTo association ( id ) with the
         * actual model instance.
         *
         * For example if belongsTo association is project, the
         * json value for project will be:  ( project: "project_id_1" )
         * and this needs to be converted to ( project: [projectInstance] )
         */
        this.eachRelationship(function(key, relationship) {
            if (relationship.kind == 'belongsTo') {
                attrs[key] = model.get(key);
            }
        });

        /*
         * Need to dissociate the new record from the old.
         */
        delete attrs.id;

        /*
         * Apply overrides if provided.
         */
        if (Ember.typeOf(overrides) === 'object') {
            Ember.setProperties(attrs, overrides);
        }

        return this.store.createRecord(root, attrs);
    }
});

Problem

I've figured out that I can clone an Ember Data record and copy its Attributes, but none of the `belongsTo`/`hasMany` relationships are cloned. Can I do this somehow if I don't know what relationships would be possible, going off of the relationships that exist? For reference, here is what I've got that will clone an Ember Data record's attributes: ``` var attributeKeys = oldModel.get('constructor.attributes.keys.list'); var newRecord = this.get('store').createRecord(oldModel.constructor.typeKey); newRecord.setProperties(oldModel.getProperties(attributeKeys)); ```

Original source

Related problems