Ember Data: разрешить встроенный идентификатор для записи

При использовании RESTAdapter у меня есть модель Organization, которая должна быть встроена в ответ. Похоже, что реализация Ember.RESTAddapter по умолчанию отправляет id, используя то же имя модели, но не как объект (в настоящее время это «работает»):

POST/PUT api/v1/item/{id}

{
    "item" {
        id: "1029383829"
        ...
        organization: "26044097612186763401268824297"
    }
}

Я ознакомился с документацией и обнаружил, что миксин DS.EmbeddedRecordsMixin должен делать это в сочетании с объявлением embedded: "always" в attrs или Serializer:

модели/item.js

var Item = DS.Model.extend({
    ...,
    organization: DS.belongsTo("organization", {embedded: "always"})
});

сериализаторы/item.js:

var ItemSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
        attrs: {
            organisation: {serialize: "id", embedded: "always"}
        }
    }
);

Однако при десериализации записей Ember Data жалуется, что ожидал объект, а получил только строку:

Утверждение не удалось: ожидался объект как data в вызове push для app@model:organization: , но был 26044097612186763401268824297

В конечном счете, я бы предпочел систему, похожую на неопубликованную загрузку, в которой дополнительный атрибут с постфиксным "_id" описывает соответствующий id встроенной записи:

{
    "item": {
        id: 1,
        name: "name",
        organization_id: "26044097612186763401268824297"
        ...
    }
}

Как разрешить сериализацию и десериализацию встроенной боковой загрузки id для моей модели Organization?


person user1429980    schedule 27.09.2014    source источник
comment
Вам не нужно указывать setialize: 'id' для attrs.organisation, так как это значение сериализатора по умолчанию.   -  person Daniel Kmak    schedule 05.12.2014


Ответы (1)


На самом деле вы не встраиваете запись, вы просто указываете идентификатор, в этом случае вы должны пометить его как асинхронный.

var Item = DS.Model.extend({
    ...,
    organization: DS.belongsTo("organization", {async: true})
});

И удалите реализацию встроенных записей.

person Kingpin2k    schedule 27.09.2014
comment
async: true предотвратил возникновение ошибки, но запросы POST и UPDATE не указывают явно, когда включается id или сам объект (желающий получить organization_id). Есть ли способ сделать это? - person user1429980; 28.09.2014