如何将没有id的子实体添加到使用normalizer规范化状态的父实体中



我最近开始在一个新的React应用程序中使用带有zustand的normalizer。到目前为止,这是一次非常好的经历,解决了我过去遇到的大多数痛苦的问题。

我刚刚遇到了一个问题,在过去的几天里,我想不出一个干净的方法来解决这个问题。

想象一下,我有一个normalizer归一化状态,看起来像:

{
"entities": {
"triggers": {
"1": {
"id": 1,
"condition": "WHEN_CURRENCY_EXCHANGED",
"enabled": true,
"value": "TRY"
},
"2": {
"id": 2,
"condition": "WHEN_CURRENCY_EXCHANGED",
"enabled": true,
"value": "GBP"
},
"3": {
"id": 3,
"condition": "WHEN_TRANSACTION_CREATED",
"enabled": true,
"value": true
}
},
"campaigns": {
"19": {
"id": 19,
"name": "Some campaign name",
"triggers": [
1,
2,
3
]
}
}
},
"result": 19
}

我们有一个页面,允许用户向活动添加一个或多个触发器,然后保存它们。问题是,在添加这些触发器时,直到用户单击"保存"按钮(id由数据库生成(,它们才有id。单击Save按钮时,状态为denormalized(通过normalizrdenormalize功能(,并作为有效载荷发送到后端,如下所示:

{
"id": 19,
"name": "Some campaign name",
"triggers": [
{
"id": 1,
"condition": "WHEN_CURRENCY_EXCHANGED",
"enabled": true,
"value": "TRY"
},
{
"id": 2,
"condition": "WHEN_CURRENCY_EXCHANGED",
"enabled": true,
"value": "GBP"
},
{
"id": 3,
"condition": "WHEN_TRANSACTION_CREATED",
"enabled": true,
"value": true
}
]
}

问题是,如果用户将实体添加到triggers,它就没有id,因为id是由数据库生成的,并且我找不到将其添加到状态的正确方法(由于规范化状态的基于id的特性(。

我能想到的唯一解决办法是,当在前端添加触发器但尚未保存时,生成一些临时ID(例如uuid(,然后在非规范化时检查每个实体,做一些类似if (isUuid(trigger.id)) delete trigger.id的事情,这似乎太乏味和变通了。

感谢你的帮助。

附言:这里也有类似的解释。问题是,在我们的案例中,generateId('comment')逻辑发生在后端。

一个简单的解决方案是拆分。

create triggerAPI调用和add trigger to campaignAPI调用。

执行第一个操作,然后使用后端生成的id将trigger保存到规范化存储中。

然后将其添加到campaign中。

相关内容

  • 没有找到相关文章