ember.js Ember数据-对hasMany关系使用ID以外的属性

e5njpo68  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(146)

我在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属性作为此关系的键。
下面的代码片段显示了我正在加载的数据的结构,其中一个标记引用了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

knpiaxh1

knpiaxh11#

我假设您使用的是RESTSerializer,它有一个primaryKey option,如果API有效负载中的主键名不是id,就应该使用它。
对于您的示例来说,这似乎有点困难,因为该记录似乎有两个主键:idpaymentId。如果只使用其中一个来引用相关记录,我建议忽略另一个。
如果两者都用来引用相关的记录,那么你的情况就不好了。也许你可以改变API?
如果这不可能,我猜你需要在序列化器中将一个IDMap到另一个ID,这需要在之前加载支付记录。这很棘手,因为序列化器是同步的,这意味着必须在之前加载记录。我猜你将面临很多边缘情况,直到这样的解决方案稳定下来-打破它将是非常容易的,因为它高度依赖于时间。
因此,也许你甚至应该考虑根本不使用Ember Data来识别这些资源。这在很大程度上取决于每个资源都可以通过其类型和ID的组合来识别的假设。但对你来说,听起来像是同一个资源可以通过两个不同的ID来识别。

相关问题