Использование первичных ключей с данными Ember
В течение последних нескольких дней я был борется с основными ключами и последней версией Ember Data.
Сначала я прочитал, как это сделать в файле Breaking Changes на GitHub, но, по-видимому, устарел. Я попробовал несколько прочее пути (с помощью Петра Вагетета на IRC), но никто из них, похоже, не работает.
Я хотел бы сделать slug
мой первичный ключ на моей модели, а также, так как я работаю с MongoDB, я бы хотел использовать _id
вместо id
.
Кто-нибудь понял, как это сделать? Моя основная проблема заключается в том, что записи модели загружаются дважды, когда я делаю несколько App.MyModel.find()
на модели.
Ответы
Ответ 1
Начиная с версии Ember Data 1.0 beta, вы определяете primaryKey
в соответствующем сериализаторе.
Для всего приложения
App.ApplicationSerializer = DS.RESTSerializer.extend({
primaryKey: '_id'
});
Для одного типа
App.FooSerializer = DS.RESTSerializer.extend({
primaryKey: '_id'
});
Вы по-прежнему ссылаетесь на него как id
на модель, но Ember Data будет сериализовать/десериализовать его до _id
во время передачи.
Пример: http://emberjs.jsbin.com/OxIDiVU/635/edit
Подробнее об этом читайте здесь: http://emberjs.com/api/data/classes/DS.RESTSerializer.html#property_primaryKey
Ответ 2
Я хотел бы сделать slug моим основным ключом на моей модели, а также, так как я работаю с MongoDB, я бы хотел использовать _id вместо id.
Используйте API-интерфейс адаптера map
, чтобы указать атрибут, который должен использоваться как первичный ключ:
App.Adapter.map('App.Person', {
primaryKey: '_id'
});
Подробнее см. serializer.js api docs. Если вам нужно дополнительно настроить, как сериализован идентификатор записей, используйте addId
hook, описанный здесь.
Поскольку данные ember-данных все еще находятся в активной разработке, документация по этой функции несколько ограничена и может измениться до версии 1.0. Тем временем обратитесь к набору тестов ember-data, чтобы увидеть примеры этого в действии. Например:
Ответ 3
Если решение, предложенное Никитой, не работает (не для меня, используя ревизию 11 данных ember-данных), вот как я изменил первичный ключ при работе с RESTAdapter:
App.Adapter = DS.RESTAdapter.extend({
serializer: "App.MySerializer"
});
// notice we extend the RESTSerializer, not Serializer!
App.MySerializer = DS.RESTSerializer.extend({
primaryKey: function(type) {
return '_id'; // you get it...
}
});
Я знаю, что это, вероятно, не поможет OP больше, но я все равно опубликую его, поскольку это может быть полезно для некоторых из вас.
Ответ 4
Попробуйте расширить свой адаптер следующим образом:
App.RESTSerializer = DS.RESTSerializer.extend({
init: function() {
this._super();
this.map('App.MyModel', {
primaryKey: "_id"
});
}
});
Ответ 5
Я использую MongoDB и Ember-Data 1.0.0- beta.6 в моем приложении, и _id поставил проблему в Ember 1.4.0 для меня тоже. Вот что я сделал для решения проблемы, предполагая, что возвращаемый массив JSON вложен в свойство root "people":
App.ApplicationSerializer = DS.RESTSerializer.extend({
normalizeHash: {
people: function(hash) {
hash.id = hash._id;
delete hash._id;
return hash;
}
}
});
Это, конечно же, сериализатор приложений, но вы можете ограничить его конкретным путем чем-то вроде App.MyPathSerializer = DS.RESTSerializer.extend({ ... });