如何以可缩放的方式取消(软删除)数据库中的记录



目前我有一个包含以下列的units表:

  • id: 主整数
  • name: 字符串
  • serial_id: 字符串

以及一张statuses桌。该单元的数据从我们的服务器发送到服务器。statuses表包含以下列:

  • id: 主整数
  • internal_temp: 浮子
  • battery_level: 整数
  • unit_id:外键整数
  • serial_id: 字符串

目前,我想void旧单位,这样我就可以保存具有重复/相同serial_id的新units但是,我仍然希望保留使unitsstatuses拥有的关系无效,并以有组织、可扩展的方式维护关系/数据。

我的第一个想法是简单地将is_void添加到units表中,然后执行以下操作:

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

但是,我不确定这是否会很好地扩展。目前,一个unit每天有近2000个status条目。

我正在考虑创建一个可以管理unitstatus之间关系的连接表,但我不确定,想寻求一些建议。

如果您使用的是 Rails 5 或更低版本,则可以使用 paranoia gem 来实现软删除功能。此 gem 要求我们在要soft_delete的模型中添加一个名为deleted_at的列。然后,它使用默认范围仅提取那些尚未软删除的记录。它提供了各种实用工具,可以轻松获取已删除的记录,真正销毁记录等。

如果您使用的是 Rails 6 或想要自己实现软删除功能,您需要执行以下操作:

  1. 将名为deleted_at的列添加到要软删除的模型中
  2. 在该模型中将默认范围添加为default_scope -> { where(deleted_at: nil) }
  3. 然后,您可以编写实用程序方法来检查记录是否被删除,或者编写范围来获取那些也被删除的记录。此 API 可以是您想要的任何内容
  4. 对于可伸缩性,您甚至可以提取出所有与软删除模型关联的常用方法,并将其简单地插入到任何需要的地方

如您所见,此实现与偏执狂宝石提供的开箱即用的实现非常相似。如果您这样做是为了学习并且有很多时间,我建议您构建自己的功能。如果这是需要尽快在专业项目中部署的东西,我建议使用 gem,因为它可能会加快该过程。

这是一篇很好的文章,描述了偏执狂宝石及其功能: 带有偏执狂宝石的轨道软删除

相关内容

  • 没有找到相关文章

最新更新