Ruby on Rails => 使用以下功能实现您自己的软删除:
应该级联删除
应该能够用不同的方法永久删除。我们应该有一个软删除和硬删除记录的方法。
请记住,软删除和硬删除也应该处理依赖: :destroy 关联。还为这些编写测试。
重要提示:请勿使用任何宝石进行软删除功能。?
您可以尝试的有趣解决方案之一:
dependent
选项是一个有效的内置解决方案,用于执行级联删除操作。然而,有一个新的 Ruby Gem,称为 Cascade Deleter,它比 dependent
内置解决方案具有许多优势。
dependent: :delete
/
dependent: :delete_all
,而且在删除根项时仍然会引发
Mysql2::Error: Cannot delete or update a parent row
MySQL 错误,以防万一您没有使用
foreign_key: { on_delete: :cascade }
设置所有数据库外键。因此,例如,如果您要删除具有 50 个降序应用程序模型的 10 个项目,则需要在 50 个应用程序模型上添加
dependent: :delete
/
dependent: :delete_all
以及执行新的迁移,更改所有外键这些50 张桌子 到
foreign_key: { on_delete: :cascade }
中的每一张。相比之下,如果你决定使用
CascadeDeleter
,你只需要执行这个单行命令即可达到相同的目标:
CascadeDeleter.where(Project.where(id: (1..10))).delete_all
软删除而不是硬删除,这对于您想要停用项目而不是从数据库中完全删除项目的系统来说非常方便。
CascadeDeleter.where(Project.where(id: (1..10))).delete_all(method: :soft)