[英]Ember data - use property other than id for hasMany relationship
我的tag
和payment
模型之間定義了多對多關系,如下所示。
//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
?
我假設您正在使用RESTSerializer
。 它有一個primaryKey
選項,如果主鍵在您的 API 負載中未命名為id
,則應使用該選項。
您的示例似乎有點困難,因為該記錄似乎有兩個主鍵: id
和paymentId
。 如果只有其中一個用於引用相關記錄,我會建議簡單地忽略另一個。
如果兩者都用於引用相關記錄,則情況很糟糕。 也許您可以更改 API?
如果這是不可能的,我想您需要在序列化程序中將一個 ID 映射到另一個 ID,這需要之前加載付款記錄。 這變得棘手,因為序列化程序是同步的,這意味着必須先加載記錄。 我想你會面臨很多邊緣情況,直到這樣的解決方案穩定 - 打破它會很容易,因為它高度依賴於時間。
因此,也許您甚至應該考慮根本不將 Ember Data 用於這些資源。 這在很大程度上取決於每個資源都可以通過其類型和 ID 的組合來標識的假設。 但聽起來對您來說,同一個資源可以由兩個不同的 ID 標識。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.