Ember Data сериализует отношения без родительского идентификатора

Я создаю адаптер для обертки Keen.io API, до сих пор я удалось успешно загрузить ресурс проекта, однако возвращенный объект выглядит следующим образом:

{
  partners_url: "/3.0/projects/<ID>/partners",
  name: "Project Name",
  url: "/3.0/projects/<ID>",
  saved_queries: [ ],
  events_url: "/3.0/projects/<ID>/events",
  id: "<ID>",
  organization_id: "<ORG ID>",
  queries_url: "/3.0/projects/<ID>/queries",
  api_key: "<API KEY>",
  events: [
    {
      url: "/3.0/projects/<ID>/events/user_signup",
      name: "user_signup"
    },
    {
      url: "/3.0/projects/<ID>/events/user_converted",
      name: "user_converted"
    },
    {
      url: "/3.0/projects/<ID>/events/user_created_project",
      name: "user_created_project"
    }
  ]
}

За исключением многих хламов, у Ember нет проблем с отображением атрибутов name и id с помощью RESTSerializer, но если я добавлю отношение events к моей модели Project, она взорвется:

Error while loading route: TypeError: Cannot set property 'store' of undefined
    at Ember.Object.extend.modelFor (http://localhost:3000/assets/ember-data.js?body=1:9813:23)
    at Ember.Object.extend.recordForId (http://localhost:3000/assets/ember-data.js?body=1:9266:21)
    at deserializeRecordId (http://localhost:3000/assets/ember-data.js?body=1:10197:27)
    at deserializeRecordIds (http://localhost:3000/assets/ember-data.js?body=1:10211:9)
    at http://localhost:3000/assets/ember-data.js?body=1:10177:11
    at http://localhost:3000/assets/ember-data.js?body=1:8518:20
    at http://localhost:3000/assets/ember.js?body=1:3404:16
    at Object.OrderedSet.forEach (http://localhost:3000/assets/ember.js?body=1:3247:10)
    at Object.Map.forEach (http://localhost:3000/assets/ember.js?body=1:3402:10)
    at Function.Model.reopenClass.eachRelationship (http://localhost:3000/assets/ember-data.js?body=1:8517:42) 

Судя по моему исследованию, это связано с тем, что он не может найти обратное отношение для сопоставления Event обратно с Project, потому что нет идентификатора родителя.

Можно ли создать отношение в Ember Data для поддержки этого? Или можно изменить сериализатор, чтобы он добавлял projectId к каждому событию перед загрузкой?

Я использую Ember 1.5.0-beta.4 и Ember Data 1.0.0-beta.7+canary.f482da04.


person Ivan    schedule 16.03.2014    source источник


Ответы (1)


Предполагая, что ваша модель Project настроена следующим образом:

App.Project = DS.Model.extend({
  events: DS.hasMany('event');
});

Вам нужно убедиться, что JSON из вашего API находится в определенной форме, которую ожидает Ember-Data.

{
  "project": {
    "id": 1,
    "events": ["1", "2"],
  },

  "events": [{
    "id": "1",
    "name": "foo"
  }, {
    "id": "2",
    "name": "bar"
  }]
}

Однако вы можете реализовать extractArray в сериализаторе вашей модели, чтобы преобразовать JSON с сервера во что-то похожее на приведенный выше пример.

В документах Ember есть рабочий пример и объяснение.

person Flo    schedule 16.03.2014