4

我有以下型号:

App.Publication = DS.Model.extend({
  title: DS.attr('string'),
  bodytext: DS.attr('string'),
  author: DS.belongsTo('author')
});

App.Author = DS.Model.extend({
  name: DS.attr('string')
});

以及以下 json 数据:

{
  "publications": [
  {
    id: '1',
    title: 'first title',
    bodytext: 'first body',
    author_id: 100
  },
  {
    id: '2',
    title: 'second title',
    bodytext: 'second post',
    author_id: 200
  }
];
}

在 Ember Data RC12 中,此方法有效(您可以在 json 中指定 author_id 或作者,并且出版物将始终链接正确的作者)。

在 Ember Data 1.0.0 中,这不再有效;作者始终为空。

在一些文档中我发现——因为我在 json 数据中使用“author_id”(而不仅仅是作者)——我需要在模型中指定键;因此:

 author: DS.belongsTo('author', { key: 'author_id' })

然而,这不起作用;出版物中的作者仍然为空。

我现在看到的唯一解决方案是实现自定义序列化程序并将 author_id 覆盖为作者(通过 normailzeId);我无法更改我的后端数据结构......因此:

App.MySerializer = DS.RESTSerializer.extend({
  //Custom serializer used for all models
  normalizeId: function (hash) {
    hash.author = hash.author_id;
    delete hash.author_id;
    return hash;
  }
});

以上是正确的方法吗?

4

2 回答 2

7

默认情况下,Ember Data 1.0 不再进行任何有效负载规范化。的key配置DS.belongsTo也已删除,因此您必须实现自定义序列化程序。

normalizeId是一个内部序列化器函数,用于将主键转换为始终可用id。你不应该覆盖它。

相反,您可以覆盖keyForRelationship为此目的提供的方法。

您可以使用以下内容:

App.ApplicationSerializer = DS.RESTSerializer.extend({
  keyForRelationship: function(rel, kind) {
    if (kind === 'belongsTo') {
      var underscored = rel.underscore();
      return underscored + "_id";
    } else {
      var singular = rel.singularize();
      var underscored = singular.underscore();
      return underscored + "_ids";
    }
  }
});

注意:我还将序列化程序重命名为,App.ApplicationSerializer以便将其用作应用程序的默认序列化程序。

最后,如果你还没有找到,请看这里的过渡笔记:https ://github.com/emberjs/data/blob/master/TRANSITION.md

如果您在最初的 1.0.0.beta.1 发布后不久通读了过渡文档,我建议您再看一遍,因为有许多新增内容,尤其是关于序列化的内容。

于 2013-09-09T06:19:39.473 回答
1

Ember 1.0.0 过渡指南

带下划线的键,_id_ids

在 0.13 中,REST 适配器自动为您骆驼化传入的键。它还期望belongsTo 关系列在下面name_id,关系列hasMany在下面name_ids

如果您的应用程序返回带有下划线属性和_id/或_ids关系的 json,您可以扩展ActiveModelSerializer,一切都将开箱即用。

App.ApplicationSerializer = DS.ActiveModelSerializer.extend({});

注意:不要将 DS.ActiveModelSerializer 与作为 Rails API 项目一部分的 ActiveModelSerializer gem 混淆。具有下划线输出和 DS.ActiveModelSerializer 的传统 Rails API 项目将执行预期的规范化行为,例如在 JSON 中将属性键骆驼化。

于 2014-01-09T23:49:53.410 回答