【问题标题】:Serialize ids when saving emberjs model保存 emberjs 模型时序列化 id
【发布时间】: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


【解决方案1】:

Ember Data 在这方面是愚蠢的,如果是 ManyToOne 关系,它只包含来自belongsTo 端的 id。老实说,我已经将提交 PR 列入我的遗愿清单,但时间有限。

https://github.com/emberjs/data/commit/7f752ad15eb9b9454e3da3f4e0b8c487cdc70ff0#commitcomment-4923439

App.ApplicationSerializer = DS.RESTSerializer.extend({

 serializeHasMany: function(record, json, relationship) {
    var key = relationship.key;
    var payloadKey = this.keyForRelationship ? this.keyForRelationship(key, "hasMany") : key;
    var relationshipType = RelationshipChange.determineRelationshipType(record.constructor, relationship);

    if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany'
        || relationshipType === 'manyToOne') {  // This is the change
      json[payloadKey] = get(record, key).mapBy('id');
      // TODO support for polymorphic manyToNone and manyToMany relationships
    }
  },
});

【讨论】:

  • 我的应用程序上已经有该代码,但它不能解决问题。如果我在 serializeHasMany 方法中执行 console.log(record) 和 console.log(json) ,则玩家数组为空,尽管来自 /api/games 调用服务器的数据填充了玩家数组......跨度>
  • 我是说代码在保存时删除了数组。它只从 belongsTo 端保存。
  • 好吧,我误会你了,反正还是没有解决办法吧?
  • 正确,Ember Data 的当前实现在不覆盖 serializeHasMany 的情况下不支持它(我将展示一个示例)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2014-12-18
  • 1970-01-01
  • 2019-06-20
  • 2010-09-12
  • 2010-10-26
相关资源
最近更新 更多