在处理相关实体时防止无效状态
Preventing invalid state when dealing with related entities
考虑一个 (ReactJS) 应用程序,其中 Group
和 User
实体通过多对多关系相互关联。
状态树如下所示:
{
groups: {
"1": {id: "1", name: "..."},
...
},
users: {
"42": {id: "42", name: "..."},
...
},
memberships: [
{groupId: "1", userId: "42"},
...
]
}
在 UI 中,用户可以 "select" 零个或多个组,每个组有零个或多个关联用户。目前以这样的状态表示:
{
selectedGroupIds: {
"1": {selectedUserIds: ["42", ...]},
...
}
}
(顺便说一句,以下设计可能比上面的设计更可取,因为它更明确;希望对此提出评论):
{
selectedGroupIds: [
{id: "1", selectedUserIds: ["42", ...]},
...
]
}
不管怎样,回到正题:
目前,当在组上下文中选择用户时,组和用户在某个时刻断开连接(成员资格终止、用户被删除等),然后 selectedGroupIds
将处于无效状态。在写这篇文章时,我现在意识到这也适用于 memberships
当组或用户被删除时。
有什么方法可以设计状态树来避免上述情况的发生吗?或者在关系发生变化的情况下,人工管理是不可避免的吗?
当 membership ends, user gets deleted, etc.
时,您必须以级联方式更新状态并移除损坏的关系。这与其他基于关系的状态更新没有任何不同。
如果不想更新数据中的关系,也可以使数组成为条件数组:
memberships: [
groups["1"] && users["42"] && {groupId: "1", userId: "42"},
...
].filter(o => o); // the filter is to ensure to remove null values that could be generated by conditions
考虑一个 (ReactJS) 应用程序,其中 Group
和 User
实体通过多对多关系相互关联。
状态树如下所示:
{
groups: {
"1": {id: "1", name: "..."},
...
},
users: {
"42": {id: "42", name: "..."},
...
},
memberships: [
{groupId: "1", userId: "42"},
...
]
}
在 UI 中,用户可以 "select" 零个或多个组,每个组有零个或多个关联用户。目前以这样的状态表示:
{
selectedGroupIds: {
"1": {selectedUserIds: ["42", ...]},
...
}
}
(顺便说一句,以下设计可能比上面的设计更可取,因为它更明确;希望对此提出评论):
{
selectedGroupIds: [
{id: "1", selectedUserIds: ["42", ...]},
...
]
}
不管怎样,回到正题:
目前,当在组上下文中选择用户时,组和用户在某个时刻断开连接(成员资格终止、用户被删除等),然后 selectedGroupIds
将处于无效状态。在写这篇文章时,我现在意识到这也适用于 memberships
当组或用户被删除时。
有什么方法可以设计状态树来避免上述情况的发生吗?或者在关系发生变化的情况下,人工管理是不可避免的吗?
当 membership ends, user gets deleted, etc.
时,您必须以级联方式更新状态并移除损坏的关系。这与其他基于关系的状态更新没有任何不同。
如果不想更新数据中的关系,也可以使数组成为条件数组:
memberships: [
groups["1"] && users["42"] && {groupId: "1", userId: "42"},
...
].filter(o => o); // the filter is to ensure to remove null values that could be generated by conditions