Как аннулировать (мягкое удаление) запись в базе данных в масштабируемом режиме - PullRequest
0 голосов
/ 06 января 2020

В настоящее время у меня есть таблица units со следующими столбцами:

  • id: PRIMARY Integer
  • name: String
  • serial_id: Строка
  • . , .

А также таблица statuses. Данные этого блока отправляются на сервер с нашего сервера. Таблица statuses имеет следующие столбцы:

  • id: ПЕРВИЧНОЕ целое число
  • internal_temp: Плавающее
  • battery_level: целое число
  • unit_id: ИНОСТРАННЫЙ КЛЮЧ Целое число
  • serial_id: Строка
  • ...

В настоящее время я хочу void из старых блоков, чтобы я мог сохранить новые units с дубликатами / одинаковыми serial_id. Однако я все еще хочу сохранить отношения, которые аннулированы units и statuses и поддерживать отношения / данные организованным, масштабируемым образом.

Моей первой идеей было просто добавить is_void в таблицу units и затем сделать что-то вроде:

Unit.where(serial_id: serial).find_by_is_void(false).statuses

но я не уверен если это будет хорошо масштабироваться. В настоящее время unit делает почти 2000 status записей в день.

Я думал о создании таблицы соединений, которая могла бы управлять отношениями между unit и status, но я не был уверен и хотел обратиться за советом.

1 Ответ

2 голосов
/ 06 января 2020

Если вы используете Rails 5 или ниже, вы можете использовать paranoia gem для реализации функции мягкого удаления. Этот драгоценный камень требует от нас добавить столбец с именем deleted_at в модель, которую мы хотим soft_delete. Затем он использует область по умолчанию для выборки только тех записей, которые не были удалены. Он предоставляет различные служебные методы для легкого извлечения удаленных записей, действительно уничтожение записей и c.

Если вы используете Rails 6 или хотите самостоятельно реализовать функцию мягкого удаления, вот что вам нужно сделать:

  1. Добавить столбец с именем deleted_at к модель, которую вы хотите мягко удалить
  2. Добавьте область действия по умолчанию в этой модели как default_scope -> { where(deleted_at: nil) }
  3. Затем вы можете написать служебные методы, чтобы проверить, удалены записи или нет, или определить области для их извлечения. записи, которые также удаляются. Этот API может быть любым, что вам нужно.
  4. . Для масштабируемости вы могли бы даже извлечь все распространенные методы, которые вы хотели бы, связанные с мягко удаленными моделями, в задачу, которую можно было просто подключить везде, где требуется * 1021. *

Как видите, эта реализация очень похожа на то, что предоставляет самоцвет паранойи из коробки. Если вы делаете это для обучения и у вас много времени, я бы порекомендовал создать собственную функцию. Если это что-то, что нужно скоро развернуть в профессиональном проекте, я бы порекомендовал использовать гем, так как он может ускорить процесс.

Это хорошая статья, которая описывает гем паранойи и его особенности: Rails Soft Delete с драгоценным камнем Paranoia

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...