【问题标题】:How to override the primary key with a JSON API attribute如何使用 JSON API 属性覆盖主键
【发布时间】:2016-03-01 19:51:26
【问题描述】:

我有一个名为“Membership”的模型,它有一个字符串属性“inviteToken”,我想将其用作我的主键。

我创建了以下序列化程序,但无法让它从 JSON 中获取主键。

app/serializers/membership.js:

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({
  primaryKey: 'invite-token' // also tried 'inviteToken'
});

我得到的具体错误是:

处理路由时出错:invitations.show 断言失败:您 必须在传递给“push”的对象中包含一个“id”作为成员资格
错误:断言失败:您必须在 传递给“推送”的对象

当我尝试通过路径中的 ID 获取记录时会发生这种情况:

import Ember from 'ember';

export default Ember.Route.extend({
  model(params) {
    return this.store.find('membership', params.token);
  }
});

API 响应:

{
  "jsonapi":{
    "version":"1.0"
  },
  "data":{
    "type":"membership",
    "id":"30",
    "attributes":{
      "invite-token":"5bGo7IhZh93E4SB07VWauw"
    }
  }
}

奇怪的是,如果我使用“type”作为主键,我会在 ember 检查器中看到“membership”作为 id。就好像 ember 数据不知道如何使用“属性”中的某些东西。我正在使用 ember 数据 2.4.0。

更新

我可以通过这样做来破解它以在我的序列化程序中工作:

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({
  normalize: function(type, hash) {
    const json =  this._super(type, hash);
    json.data.id = json.data.attributes.inviteToken;

    return json;
  }
});

【问题讨论】:

  • 什么时候出现这些错误?与store 有关的具体代码是什么?
  • @DanielKmak 我添加了路由代码和一个序列化程序,它可以满足我的需要。

标签: ember.js ember-data json-api


【解决方案1】:

序列化程序期望 primaryKey 的值引用 json 中的顶级元素。这就是“type”和“id”起作用的原因。目前不支持嵌套属性(例如primaryKey:“attributes.invite-token”)

但是有两个很好的解决方法:

第一个是覆盖 extractId 方法。 default implementation 非常简单。在您的情况下,您可以执行以下操作:

extractId(modelClass, resourceHash) {
    var id = resourceHash['attributes']['invite-key';
    return coerceId(id);
  },

第二种方法是你发现的方法,比较蛮力的方法,就是在normalize函数中手动分配id。

【讨论】:

    猜你喜欢
    • 2022-10-05
    • 1970-01-01
    • 2013-07-19
    • 2011-11-06
    • 1970-01-01
    • 2015-01-08
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多