2013-03-12 3 views
8

Я видел, как этот вопрос обсуждался, но у меня все еще возникают проблемы с манипулированием Монгосом _id в id. Я использую mongoose как свой ORM, и хотя у него есть виртуальные машины, я не могу заставить его работать правильно. Ниже приводится то, что у меня есть в моей модели мангуста.Ember, Ember Data и MongoDB's _id

Попытка исправить От Backend

mongoose = require 'mongoose' 
Schema = mongoose.Schema 
ObjectId = Schema.ObjectId 

ApartmentSchema = new Schema 
    body: String 
    date: { type: Date, default: Date.now } 
    deleted: {type: Boolean, default: false} 
    saved: {type: Boolean, default: false} 
    visited: {type: Boolean, default: false} 
    email: String 
    phoneNumber: String 
    href: String 

ApartmentSchema.virtual('id').get -> return @_id 

module.exports = mongoose.model 'Apartment', ApartmentSchema 

Когда я создаю новый экземпляр этой модели в экспрессе я могу сделать посмотреть, как apt.id и получить идентификатор обратно, но когда я отправить ответ вниз для клиента, у меня просто есть _id, а не id.

Второе решение, которое я пробовал, состояло в том, чтобы создать рассчитанное свойство для id, но по какой-либо причине ember это не нравится. Здесь есть две проблемы. Эмбер не уважает вычисленное свойство id или, по крайней мере, не больше. Это то, на что похожа моя модель данных ember-данных.

Попытка исправить его из Frontend

App.Apartment = DS.Model.extend({ 
    body: DS.attr('string'), 
    date: DS.attr('date'), 
    deleted: DS.attr('boolean'), 
    saved: DS.attr('boolean'), 
    visited: DS.attr('boolean'), 
    email: DS.attr('string'), 
    phone: DS.attr('string'), 
    _id: DS.attr('string'), 
    id : function() { 
    return this.get('_id') 
    }.property('_id') 
}); 

В шаблоне ниже, ничего не делает для идентификатора.

{{#each apartment in controller}} 
    <li>{{apartment.body}} | {{apartment.date}} | {{apartment.href}} {{apartment.id}}</a> {{#linkTo 'apartment' apartment }} View {{/linkTo}} </li> 
{{/each}} 

В linkTo помощники работают, но URL имеет нулевой где идентификатор должен быть. Это приводит к разрыву подкладки и загрузке данных несколько раз. Ниже мой маршрутизатор для некоторого контекста.

App.Router.map(function(){ 
    this.resource('apartments', function(){ 
    this.resource('apartment', { path: ':apartment_id' }); 
    }); 
}); 

Изменение имени моего вычисленной id собственности на что-то вроде foo, а затем изменить мой маршрутизатор path: ':apartment_foo' результатов в адресах, которые имеют ссылки на объект в URL-адрес, например: #/apartments/<App.Apartment:ember357:null>.

Это похоже на то, что меня беспокоит эмбер. Любая помощь будет оценена по достоинству.

ответ

9

Начиная с версии Ember 1.0.0-rc 1 и Ember Data 11 это лучший способ решить эту проблему.

App.Adapter = DS.RESTAdapter.extend({ 
    serializer: DS.RESTSerializer.extend({ 
    primaryKey: function(type){ 
     return '_id'; 
    } 
    }) 
}); 

App.Store = DS.Store.extend({ 
    revision: 11, 
    adapter: 'App.Adapter' 
}); 
+0

Для меня это изменяет «нулевую» часть маршрута на «объект объекта», поскольку идентификатор объекта BSON сериализуется как объект (например, '' _id ": {" $ oid ":" 5147130ffddd310aeb000001 "}') , Было ли исправление в исходном вопросе, который превращает это в строку? –

7

В Эмбер данных - Версия: v1.0.0-beta.2, я был в состоянии сделать следующее:

App.ApplicationSerializer = DS.RESTSerializer.extend({ 
    primaryKey: "_id" 
}); 

Я довольно новыми для Ember, так что это не может быть лучший способ, но он сработал!

+0

После поиска часов это единственное, что сработало для меня, спасибо – iConnor

+0

Данные Ember уменьшили количество доступных методов в последнее время, это, похоже, не документировано, но атрибут первичного ключа - это [этот частный метод] (https://github.com/emberjs/data/blob/v1.0.0-beta.3/packages/ember-data/lib/serializers/rest_serializer.js#L162). –

5

У меня была такая же проблема, как Крис с ид ищет что-то вроде этого:

"_id":{"$oid":"52772aa44f6c6c5dd0000000"} 

Добавление $ OID часть к решению claptimes' работал для меня.

App.ApplicationSerializer = DS.RESTSerializer.extend({ 
    primaryKey: "_id.$oid" 
}); 
+0

Почти работает для меня, но кажется, что идентификатор все еще не возвращается (хотя все остальные данные возвращаются). –

+0

У меня возникла аналогичная проблема между монгодскими и ember-данными, если кто-то хочет взглянуть: http://stackoverflow.com/questions/20544371/ember-data-1-0-0-activemodeladapter-error-include-an -id-in-a-hash-pass-to-p – brg

2

С момента перехода на Ember-CLI этот процесс несколько изменился.Теперь вы хотите сделать это:

  1. Из командной проекта линии Ember-CLI:

    ember g serializer application 
    
  2. сделать ваш вновь созданный сериализатору выглядеть следующим образом:

    import DS from 'ember-data'; 
    
    export default DS.RESTSerializer.extend({ 
        primaryKey: '_id' 
    }); 
    
0

С Ember 2.0.0 правильный способ нормализации Mongo ID - использовать extractId в сериализаторе. Вот пример для RESTSerializer работает против API Rails/Grape:

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 
    isNewSerializerAPI: true, 
    extractId: function (modelClass, resourceHash) { 
    return resourceHash.id.$oid; 
    } 
}); 

Обратите внимание, что вы должны установить isNewSerializerAPI в true для этой работы.

Для вашей потребности вы можете попробовать перейти на resourceHash._id.$id или что-то еще для вас. Если вы не уверены, попробуйте console.log(resourceHash) для проверки данных.

+0

Использование 'resourceHash._id. $ oid' работает для меня. –