【问题标题】:Ember Data 1.0.0: what is expected format for belongsTo relationshipEmber Data 1.0.0:belongsTo 关系的预期格式
【发布时间】:2013-09-08 18:28:21
【问题描述】:

我有以下型号:

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;
  }
});

以上方法正确吗?

【问题讨论】:

  • 您仍然可以使用下划线属性,请参阅下面的答案。

标签: ember.js ember-data


【解决方案1】:

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

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 发布后不久通读过渡文档,我建议您再看一遍,因为其中有许多新增内容,尤其是关于序列化的内容。

【讨论】:

  • 谢谢贾斯汀。 keyForRelationship 看起来很新。我对您的示例感到困惑:您将“_id”添加到关系中,而我的发现表明我需要从关系属性中删除 _id。过渡说明中提供了一个示例,在此示例中,它们还删除了 _id。我错过了什么吗?
  • 有几个不同的标准化钩子可用。 TRANSITION.md 中的示例实现了 normalize 并以您期望的方式调整有效负载密钥。但是,如上实现keyForRelationship 具有相同的效果。原因是在normalize的默认实现中,normalizeRelationships被调用,它遍历模型上定义的每个关系,使用keyForRelationship在有效负载中查找每个关系属性,最后使用它设置预期的模型属性.
  • 如果你有兴趣,来源在这里:github.com/emberjs/data/blob/…
  • 感谢您的帮助,一段时间以来,我一直在尝试了解测试版中的关系处理。
【解决方案2】:

来自Ember 1.0.0 Transition Guide

带下划线的键,_id_ids

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

如果您的应用程序返回带有下划线属性的 json 和 _id_ids 用于关系,您可以扩展 ActiveModelSerializer,所有这些都可以立即使用。

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

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

【讨论】:

    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多