save(options) {
        let {_super} = this;

        options = options || {};
        options.wasSave = true;

        // model.destroyRecord() calls model.save() behind the scenes.
        // in that case, we don't need validation checks or error propagation,
        // because the model itself is being destroyed.
        if (this.isDeleted) {
            return this._super(...arguments);
        }

        // If validation fails, reject with validation errors.
        // If save to the server fails, reject with server response.
        return this.validate(options).then(() => {
            if (typeof this.beforeSave === 'function') {
                this.beforeSave();
            }
            return _super.call(this, options);
        }).catch((result) => {
            // server save failed or validator type doesn't exist
            if (result && !isEmberArray(result)) {
                throw result;
            }

            return RSVP.reject(result);
        });
    }
The primary goal of this method is to override the `save` method on Ember Data models.
This allows us to run validation before actually trying to save the model to the server.
You can supply options to be passed into the `validate` method, since the ED `save` method takes no options.