软删除和硬删除Ruby on Rails

问题描述 投票:0回答:2

Ruby on Rails => 使用以下功能实现您自己的软删除:

  1. 应该级联删除

  2. 应该能够用不同的方法永久删除。我们应该有一个软删除和硬删除记录的方法。

  3. 请记住,软删除和硬删除也应该处理依赖: :destroy 关联。还为这些编写测试。

重要提示:请勿使用任何宝石进行软删除功能。?

cascading-deletes
2个回答
0
投票

您可以尝试的有趣解决方案之一:

https://github.com/rubysherpas/paranoia


0
投票

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)

    𝐏𝐞𝐫𝐟𝐨𝐫𝐦𝐚𝐧𝐜𝐞
最后,您还可以决定删除一组根项,而不是逐个删除这些根项。这可以在上面的示例中看到,它删除 10 个项目,而不是单独删除项目。这一事实提高了性能,因为对所需的表执行单个 SQL 删除操作。此过程也适用于降序类别。

© www.soinside.com 2019 - 2024. All rights reserved.