【问题标题】:How to void (soft delete) a record in database in a scalable fashion如何以可扩展的方式取消(软删除)数据库中的记录
【发布时间】:2020-01-06 15:21:58
【问题描述】:

目前我有一个units 表,其中包含以下列:

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

还有一个statuses 表。本单元的数据从我们的服务器发送到服务器。 statuses 表具有以下列:

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

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails database activerecord


    【解决方案1】:

    如果您使用的是 Rails 5 或更低版本,您可以使用paranoia gem 来实现软删除功能。这个 gem 需要我们添加一个名为 deleted_at 的列到我们想要软删除的模型中。然后它使用默认范围仅获取那些没有被软删除的记录。它提供了各种实用方法来轻松获取已删除记录、真正销毁记录等。

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

    1. 将名为deleted_at 的列添加到要软删除的模型中
    2. 在该模型中添加一个默认范围为default_scope -> { where(deleted_at: nil) }
    3. 然后您可以编写实用程序方法来检查记录是否被删除,或者使用范围来获取那些也被删除的记录。这个 API 可以是你想要的任何东西
    4. 为了实现可扩展性,您甚至可以将与软删除模型相关联的所有常用方法提取到关注点中,以便在需要的地方轻松插入

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

    这是一篇很好的文章,描述了偏执狂宝石及其功能:Rails Soft Delete with Paranoia gem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2023-03-26
      • 2022-06-27
      • 2012-07-25
      • 2017-05-19
      • 2016-07-13
      相关资源
      最近更新 更多