【问题标题】:Ember data - use property other than id for hasMany relationshipEmber 数据 - 对 hasMany 关系使用除 id 之外的属性
【发布时间】:2020-02-19 08:52:45
【问题描述】:

我的tagpayment 模型之间定义了多对多关系,如下所示。

//models/tag.js
import Model, { attr, hasMany } from '@ember-data/model';

export default Model.extend({
  name: attr('string'),
  backgroundColour: attr('string'),
  textColour: attr('string'),
  payments: hasMany('payment')
});

// models/payment.js
import Model, { attr, hasMany } from '@ember-data/model';

export default Model.extend({
  date: attr('date'),
  amount: attr('number'),
  paymentId: attr('string'),
  tags: hasMany('tag'),
});

默认情况下,当我向付款添加标签时,付款的id 用作关系的键。我的目标是让 Ember 数据使用 paymentId 属性作为这种关系的键。

下面的 sn-p 显示了我正在加载的数据的结构,其中一个标签引用了 paymentId 属性的付款。

    // Example tag
    {
      "id": "25",
      "name": "Groceries",
      "backgroundColour": "31b04b",
      "textColour": "ffffff",
      "payments": ["20190121201902210"] // References paymentId rather than id
    },
    
    // Example payment
    {
      "id": "1"
      "date": "2019-01-27T22:00:00.000Z",
      "amount": 1644.44,
      "paymentId": "20190121201902210",
      "tags": ["25"]
    }

我尝试如下自定义支付序列化程序,

// serializers/payment.js

import ApplicationSerializer from './application';

export default ApplicationSerializer.extend({
  keyForRelationship(key, _relationship) {
    if (key === 'payments') {
      return 'paymentId';
    }
  },
});

但是,在加载模型时出现此错误:Assertion Failed: All elements of a hasMany relationship must be instances of Model, you passed [ "20190121201902210" ]

如何让 Ember 数据在查找相关付款时使用 paymentId 而不是 id

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    我假设您使用的是RESTSerializer。它有一个primaryKey option,如果您的 API 有效负载中的主键未命名为 id,则应使用它。

    您的示例似乎有点困难,因为该记录似乎有两个主键:idpaymentId。如果只使用其中一个来引用相关记录,我建议直接忽略另一个。

    如果两者都用于引用相关记录,则情况不佳。也许您可以更改 API?

    如果这不可能,我猜您需要在序列化程序中将一个 ID 映射到另一个 ID,这需要之前加载付款记录。这变得很棘手,因为序列化程序是同步的,这意味着必须先加载记录。我想在这样的解决方案稳定之前,您将面临很多极端情况 - 打破它会很容易,因为它高度依赖于时间。

    因此,也许您甚至应该考虑根本不将 Ember Data 用于这些资源。它高度依赖于每个资源可以通过其类型和 ID 的组合来识别的假设。但听起来对您来说,同一个资源可以由两个不同的 ID 标识。

    【讨论】:

    • 这个用例很不寻常,因为没有 API - 用户选择 PDF 文件,然后从其中读取数据,然后使用 saveRecord 将其播种到 Ember 数据中。 ID 是 Ember 数据添加的,但我在整个应用程序中都忽略了它,仅将 paymentId 用于相关数据。
    • 在这种情况下,您应该做两件事:将 primaryKey 更改为 paymentId 并将客户端生成的 ID 提供给 Ember Data。
    猜你喜欢
    • 2015-11-17
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多