Использование первичных ключей с данными Ember - программирование
Подтвердить что ты не робот

Использование первичных ключей с данными Ember

В течение последних нескольких дней я был борется с основными ключами и последней версией Ember Data.

Сначала я прочитал, как это сделать в файле Breaking Changes на GitHub, но, по-видимому, устарел. Я попробовал несколько прочее пути (с помощью Петра Вагетета на IRC), но никто из них, похоже, не работает.

Я хотел бы сделать slug мой первичный ключ на моей модели, а также, так как я работаю с MongoDB, я бы хотел использовать _id вместо id.

Кто-нибудь понял, как это сделать? Моя основная проблема заключается в том, что записи модели загружаются дважды, когда я делаю несколько App.MyModel.find() на модели.

4b9b3361

Ответ 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({ ... });