存储新对象时的自引用

时间:2019-05-01 14:28:16

标签: ember.js ember-data

我们有一个Ruby on Rails后端服务器和一个EmberJS前端。

我们在Ember中创建一个新对象,该对象是树结构的一部分(具有父级,子级等)。我们希望返回树形结构中的所有对象,作为后端服务器回复的一部分。例如。当我们创建一个新对象时,我们将返回自身+祖先。这就是问题所在。服务器的回复返回新对象的ID,并且在self +祖先数据中引用了相同的ID。这会导致Ember / Ember数据拒绝该数据,因为该ID已在数据存储区中被引用;例如:

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"
               }
            ]
         }
      }
   }
}

返回的对象的ID为0bf1f751-6e00-4652-96fa-840d5390f01d,并且答复的self-and-descendantsself-and-ancestors部分中存在相同的ID。

关于我们如何存储/保存数据的示例如下:

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) {
            }
       },
   }
});

0 个答案:

没有答案