Каждый день данные важнее для программного приложения, потому что с каждым разом с ними можно делать больше вещей. Тривиальные на первый взгляд метаданные могут позволить многое сделать, изменив способ ведения бизнеса.

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

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

Один из способов решения этого логического удаления — перемещение данных из исходной таблицы в другую историческую, поэтому при выполнении запросов к основной таблице удаленные элементы не будут отображаться во внешнем интерфейсе. Несмотря на то, что это правильное решение, это не всегда лучший вариант, и его может быть сложно применить, если этот элемент связан с другими таблицами.

Другой вариант, менее радикальный, чем перемещение данных между таблицами, заключается в фильтрации удаленных элементов путем добавления дополнительного столбца, который может определить, был ли элемент ранее удален или нет. Проблема в том, что если наши запросы к этой таблице уже реализованы, их необходимо обновить, чтобы фильтровать по этому новому столбцу. То же самое будет происходить для каждого нового запроса к этой коллекции.

Применив эту проблему к реальному случаю, я оказался в такой ситуации при разработке решения для приложения на Ruby on Rails с базой данных Postgres. Тут на помощь пришел гем paranoia, решающий именно этот тип сценария.

Идея этой жемчужины заключается в добавлении нового столбца типа datetime, в котором указывается дата удаления элемента. Ясно, что все элементы изначально установлены как нулевые. Однако интересно то, что нам не нужно будет изменять какой-либо запрос к этой таблице, чтобы фильтр вступил в силу, ни предыдущий, ни новый. Это делается внутренне путем перезаписи методов ActiveRecord с учетом того, является ли этот новый столбец нулевым или нет.

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

Конечно, решение, хотя оно и не применимо ко всем случаям, является отличным выбором и позволяет избежать дополнительной работы, чтобы элементы были удалены и скрыты от конечного пользователя. Хотя это относится к стеку Ruby on Rails + Postgres, цель состояла в том, чтобы показать учебный пример, в котором можно использовать это решение, и этот драгоценный камень является отличным примером. Если вы работаете с Node.js, взгляните на этот пакет, который намерен следовать тому же предложению, но перенесен на mongoose. Если вы работаете с другим языком или фреймворком, но до сих пор нет библиотеки, предлагающей это, я рекомендую вам поработать над этим решением.

Спасибо за чтение!