2013-09-08 2 views
4

У меня есть следующие модели:Ember данных 1.0.0: что, как ожидается, формат belongsTo отношений

App.Publication = DS.Model.extend({ 
    title: DS.attr('string'), 
    bodytext: DS.attr('string'), 
    author: DS.belongsTo('author') 
}); 

App.Author = DS.Model.extend({ 
    name: DS.attr('string') 
}); 

И на следующие JSon данные:

{ 
    "publications": [ 
    { 
    id: '1', 
    title: 'first title', 
    bodytext: 'first body', 
    author_id: 100 
    }, 
    { 
    id: '2', 
    title: 'second title', 
    bodytext: 'second post', 
    author_id: 200 
    } 
]; 
} 

В Ember данных RC12 это работало (вас может указывать author_id OR author в json, и публикация всегда будет содержать правильный автор).

В Ember Data 1.0.0 это больше не работает; автор всегда имеет значение null.

В некоторых документах я обнаружил, что - поскольку я использую «author_id» в данных json (а не просто для автора) - мне нужно указать ключ в модели; таким образом:

author: DS.belongsTo('author', { key: 'author_id' }) 

Это, однако, не работает; автор в публикации остается недействительным.

Единственное решение, которое я вижу сейчас, - реализовать пользовательский сериализатор и переопределить author_id для автора (через normailzeId); Я не могу изменить свою структуру данных бэкэнд ... таким образом:

App.MySerializer = DS.RESTSerializer.extend({ 
    //Custom serializer used for all models 
    normalizeId: function (hash) { 
    hash.author = hash.author_id; 
    delete hash.author_id; 
    return hash; 
    } 
}); 

Правильно ли это указано выше?

+0

Вы все еще можете использовать подчеркнутые свойства, см. Мой ответ ниже. – rxgx

ответ

7

Ember Data 1.0 по умолчанию не имеет нормализации полезной нагрузки. Была удалена конфигурация key для DS.belongsTo, поэтому вам придется реализовать собственный сериализатор.

normalizeId - внутренняя функция сериализатора, используемая для преобразования первичных ключей, всегда доступная по адресу id. Вы не должны переопределять это.

Вместо этого вы можете переопределить метод keyForRelationship, который предусмотрен для этой цели.

Вы могли бы использовать что-то вроде следующего:

App.ApplicationSerializer = DS.RESTSerializer.extend({ 
    keyForRelationship: function(rel, kind) { 
    if (kind === 'belongsTo') { 
     var underscored = rel.underscore(); 
     return underscored + "_id"; 
    } else { 
     var singular = rel.singularize(); 
     var underscored = singular.underscore(); 
     return underscored + "_ids"; 
    } 
    } 
}); 

Примечание: Я также переименовал сериалайзер к App.ApplicationSerializer так, что она будет использоваться в качестве сериализатором по умолчанию для вашего приложения.

Наконец, если вы еще не нашли, пожалуйста, обратите внимание на переход ноты здесь: https://github.com/emberjs/data/blob/master/TRANSITION.md

Если вы читаете через переходный документ вскоре после первоначального выпуска 1.0.0.beta.1 I рекомендовал бы взглянуть еще раз, поскольку было добавлено несколько дополнений, особенно в отношении сериализации.

+0

Thx Justin. keyForRelationship выглядит что-то очень новое. Я смущен вашей выборкой: вы добавляете «_id» к отношениям, тогда как мои данные показывают, что мне нужно удалить _id из свойства отношения. Образец приведен в примечании о переходе, и в этом примере они также удаляют _id. Я что-то упускаю ? – cyclomarc

+0

Имеется несколько различных крючков нормализации. Пример в [TRANSITION.md] (https://github.com/emberjs/data/blob/master/TRANSITION.md) реализует 'normalize' и обрабатывает ключи полезной нагрузки так, как вы ожидали. Однако реализация «keyForRelationship», как указано выше, имеет тот же эффект. Причина в том, что в стандартной реализации 'normalize' вызывается' normalizeRelationships', которая выполняет итерацию по каждой зависимости, определенной в модели, использует 'keyForRelationship' для поиска каждого атрибута отношения в полезной нагрузке и, наконец, устанавливает атрибут ожидаемой модели, используя его , –

+0

Если вас интересует, источник находится здесь: https://github.com/emberjs/data/blob/4bf1b7a09575ae65e1570a4a4c12c629bdd86a5e/packages/ember-data/lib/serializers/rest_serializer.js#L205-L221 –

1

От Ember 1.0.0 Transition Guide:

подчеркнутых Ключей, _id и _ids

В 0.13, остальные адаптеры автоматически camelized входящих ключей для вас. Он также ожидал, что отношения относятся к name_id и hasMany отношениям, которые перечислены ниже name_ids.

Если ваше приложение возвращает json с подчеркнутыми атрибутами и _id или _ids для связи, вы можете продлить ActiveModelSerializer, и все будет работать из коробки.

App.ApplicationSerializer = DS.ActiveModelSerializer.extend({}); 

Примечание: DS.ActiveModelSerializer не следует путать с драгоценным камнем ActiveModelSerializer, который является частью проекта API Rails. Обычный проект API Rails с выделенным продуктом, а DS.ActiveModelSerializer будет выполнять ожидаемое поведение нормализации, например, верблюжку ключей свойств в вашем JSON.