【发布时间】:2014-07-20 14:00:52
【问题描述】:
我有一个由 nodejs 服务器和 mongodb 支持的 emberjs 应用程序。目前我的数据库正在发送带有 '_id' 字段的文档。我有以下代码来强制 Ember 将 '_id' 视为主键:
App.ApplicationSerializer = DS.RESTSerializer.extend({
primaryKey: '_id'
});
另一方面,我有两个通过“hasMany”关系相关的模型:
App.Player = DS.Model.extend({
name: DS.attr('string'),
thumbLink: DS.attr('string'),
activeGame: DS.belongsTo('game', { async: true }),
email: DS.attr('string'),
firstName: DS.attr('string'),
lastName: DS.attr('string'),
admin: DS.attr('boolean')
});
App.Game = DS.Model.extend({
name: DS.attr('string'),
active: DS.attr('boolean'),
players: DS.hasMany('player', { async: true })
});
问题是,当我尝试在控制器上保存模型(this.get('model').save())时,id 没有序列化,结果是 ember 发送以下内容:
{"game":{"name":"Indie/Rock","active":false,"players":[],"_id":"53cbbf43daa978983ee0b101"}}
正如您所见,玩家数组是空,因此,服务器正在保存该空数组,这实际上是不正确的。我知道可以在模型上使用 { embedded: true } 并从服务器返回带有嵌入文档的模型,但我想保留 async 功能。
我尝试从EmbeddedRecordsMixing 扩展游戏序列化程序,如下所示:
App.GameSerializer = DS.ActiveModelSerializer
.extend(DS.EmbeddedRecordsMixin)
.extend({
attrs: {
players: {serialize: 'ids', deserialize: 'ids'},
}
});
但是当我这样做时,即使 ApplicationSerializer 应该告诉 Ember 用户 _id 作为主键,我也会从 ember 收到以下错误:
Assertion Failed: Error: Assertion Failed: You must include an `id` for App.Game in a hash passed to `push`
我的问题是是否有可能保持 ember-data 的 async 功能,同时能够序列化具有 ids 关系的文档并使用 _id 作为一个主键。
谢谢。
【问题讨论】:
标签: node.js mongodb serialization ember.js ember-data