Самостоятельная ссылка при хранении нового объекта - PullRequest
0 голосов
/ 01 мая 2019

У нас есть бэкэнд-сервер Ruby on Rails и интерфейс EmberJS.

Мы создаем новый объект в Ember, который является частью древовидной структуры (имеет родителя, детей и т. Д.). Мы хотели бы вернуть все объекты в древовидной структуре как часть ответа от внутреннего сервера; например. когда мы создадим новый объект, мы вернем себя + предков. Вот где возникает проблема. Ответ от сервера возвращает идентификатор для нового объекта и , на который ссылаются те же идентификаторы в данных self + ancestors. Это приводит к тому, что данные Ember / Ember отклоняют данные, поскольку на идентификатор уже ссылаются в хранилище данных; например:

Error: Assertion Failed: 'node' was saved to the server, but the response returned the new id '9f06c18e-0507-41d2-a8af-c330fa896bac', which has already been used with another record.

Есть ли способ настроить модель так, чтобы описанное выше было возможно? Например. Данные Ember / Ember не будут отклонять новый объект, так как на него уже есть ссылка в ответе?

РЕДАКТИРОВАТЬ: Добавление примера ответа

Пример ответа от сервера может быть таким:

{  
   "data":{  
      "id":"0bf1f751-6e00-4652-96fa-840d5390f01d",
      "type":"accounts",
      "attributes":{  
         "name":"Global"
      },
      "relationships":{  
         "parent":{  
            "data":null
         },
         "children":{  
            "data":[  
               {  
                  "id":"77fbf094-610a-42c0-841b-693aefbd5e52",
                  "type":"accounts"
               }
            ]
         },
         "self-and-ancestors":{  
            "data":[  
               {  
                  "id":"0bf1f751-6e00-4652-96fa-840d5390f01d",
                  "type":"accounts"
               }
            ]
         },
         "self-and-descendants":{  
            "data":[  
               {  
                  "id":"0bf1f751-6e00-4652-96fa-840d5390f01d",
                  "type":"accounts"
               },
               {  
                  "id":"77fbf094-610a-42c0-841b-693aefbd5e52",
                  "type":"accounts"
               }
            ]
         }
      }
   }
}

Идентификатор возвращаемого объекта - 0bf1f751-6e00-4652-96fa-840d5390f01d, и тот же идентификатор присутствует в разделе self-and-descendants и self-and-ancestors ответа.

Пример того, как мы храним / сохраняем данные, выглядит следующим образом:

import Component from '@ember/component';
import Changeset from 'ember-changeset';

import { inject as service } from '@ember/service';

const { get, set } = Ember;

export default Component.extend({
    store: service(),

    formType: '',

   didReceiveAttrs() {
       this._super(...arguments);

       let formType = get(this, 'formType');

       switch(formType) {
           case 'new':
               this.newCar();
               break;

        }
   },

   newCar() {
        let car = this.get('store').createRecord('car', {});
        let changeset = new Changeset(car);

        set(this, 'changeset', changeset);
       set(this, 'form-action', 'createCar');
   },

   actions: {
       createCar(changeset) {
            changeset.save().then(success).catch(failure);

            let self = this;

            function success() {
            }

            function failure(e) {
            }
       },
   }
});
...