Ember Data - сохранение потерь в памяти имеет много отношений
У меня проблема с адаптером Ember Data Fixture. При сохранении записи вся запись имеет много ассоциаций. Я создал простой JS Bin, чтобы проиллюстрировать проблему: http://jsbin.com/aqiHUc/42/edit
Если вы редактируете любого пользователя и сохраняете, все проекты исчезают.
Это использует Ember 1.0.0 и последнюю сборку данных Ember.
Я не уверен, что я делаю что-то неправильно или если это проблема с Ember Data.
Спасибо
Ответы
Ответ 1
Чтобы ответить на мой вопрос, DS.JSONSerializer.serializeHasMany
, похоже, обрабатывает и сериализует типы отношений ManyToNone и manyToMany. Вы можете переопределить это поведение, используя специальный сериализатор для модели:
var get = Ember.get;
App.UserSerializer = DS.RESTSerializer.extend({
serializeHasMany: function(record, json, relationship) {
var key = relationship.key;
var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === 'manyToOne') {
json[key] = get(record, key).mapBy('id');
}
}
});
Все еще не совсем уверен, является ли это ошибкой или это желаемое/ожидаемое поведение.
Ответ 2
Я столкнулся с той же проблемой и пришел к такому же решению. Неужели это ошибка в данных ember?
Здесь мое решение, единственное различие заключается в том, что я изменяю JSONSerializer, а не расширенный RESTSerializer, потому что я использую локальный адаптер для хранения.:
DS.JSONSerializer.reopen({
serializeHasMany : function(record, json, relationship) {
var key = relationship.key;
var relationshipType = DS.RelationshipChange.determineRelationshipType(
record.constructor, relationship);
if (relationshipType === 'manyToNone'
|| relationshipType === 'manyToMany'
|| relationshipType === 'manyToOne') {
json[key] = Ember.get(record, key).mapBy('id');
// TODO support for polymorphic manyToNone and manyToMany
// relationships
}
}
});
Ответ 3
Это не ошибка, а выбор дизайна в Ember Data.
Метод JSONSerializer.serializeHasMany не сериализует manyToOne по дизайну; обычно внешний ключ сохраняется на стороне, принадлежащей стороне, и hasOne может не сохранять внешний ключ
В этом сообщении объясняется работа: http://www.toptal.com/emberjs/a-thorough-guide-to-ember-data см. раздел "Отношения" один ко многим "и" многие к одному "" взломать - заставить сериализовать идентификаторы DS.hasMany, вы можете использовать Embedded Records Mixin. например, attrs: {someRelationship: {serialize: 'ids'}}
Ответ 4
Теперь DS.RelationshipChange удаляется. Вы должны использовать record.constructor, например:
record.constructor.determineRelationshipType(relationship)
которые показывают ваш тип отношения.