Предотвращение недопустимого состояния при работе со связанными объектами - PullRequest
0 голосов
/ 07 января 2019

Рассмотрим приложение (ReactJS), в котором сущности Group и User связаны друг с другом отношением «многие ко многим».

Дерево состояний выглядит так:

{
  groups: {
    "1": {id: "1", name: "..."}, 
    ...
  },
  users: {
    "42": {id: "42", name: "..."}, 
  ...
  },
  memberships: [
    {groupId: "1", userId: "42"}, 
    ...
  ]
}

В пользовательском интерфейсе пользователь может «выбрать» ноль или более групп с нолем или более связанных пользователей на группу. В настоящее время он представлен в таком состоянии:

{
  selectedGroupIds: {
    "1": {selectedUserIds: ["42", ...]}, 
    ...
  }
}

(кроме того, следующий дизайн может быть предпочтительнее приведенного выше, поскольку он более явный; буду благодарен за комментарии по этому поводу):

{
  selectedGroupIds: [
    {id: "1", selectedUserIds: ["42", ...]}, 
    ...
  ]
}

В любом случае, вернемся к основному вопросу:

В настоящее время, когда пользователь выбирается в контексте группы, и в какой-то момент группа и пользователь отключаются (членство заканчивается, пользователь удаляется и т. Д.), Тогда selectedGroupIds будет в недопустимом состоянии. При написании этого я теперь понимаю, что это также относится к memberships, когда удаляются группы или пользователи.

Есть ли способ спроектировать дерево состояний так, чтобы вышеописанный сценарий был предотвращен? Или ручная уборка неизбежна в случае изменения отношений?

1 Ответ

0 голосов
/ 07 января 2019

Когда 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...