目前我有一个包含以下列的units
表:
id
: 主整数name
: 字符串serial_id
: 字符串- 。
以及一张statuses
桌。该单元的数据从我们的服务器发送到服务器。statuses
表包含以下列:
id
: 主整数internal_temp
: 浮子battery_level
: 整数unit_id
:外键整数serial_id
: 字符串- 。
目前,我想void
旧单位,这样我就可以保存具有重复/相同serial_id
的新units
。但是,我仍然希望保留使units
和statuses
拥有的关系无效,并以有组织、可扩展的方式维护关系/数据。
我的第一个想法是简单地将is_void
添加到units
表中,然后执行以下操作:
Unit.where(serial_id: serial).find_by_is_void(false).statuses
但是,我不确定这是否会很好地扩展。目前,一个unit
每天有近2000个status
条目。
我正在考虑创建一个可以管理unit
和status
之间关系的连接表,但我不确定,想寻求一些建议。
如果您使用的是 Rails 5 或更低版本,则可以使用 paranoia gem 来实现软删除功能。此 gem 要求我们在要soft_delete的模型中添加一个名为deleted_at
的列。然后,它使用默认范围仅提取那些尚未软删除的记录。它提供了各种实用工具,可以轻松获取已删除的记录,真正销毁记录等。
如果您使用的是 Rails 6 或想要自己实现软删除功能,您需要执行以下操作:
- 将名为
deleted_at
的列添加到要软删除的模型中 - 在该模型中将默认范围添加为
default_scope -> { where(deleted_at: nil) }
- 然后,您可以编写实用程序方法来检查记录是否被删除,或者编写范围来获取那些也被删除的记录。此 API 可以是您想要的任何内容
- 对于可伸缩性,您甚至可以提取出所有与软删除模型关联的常用方法,并将其简单地插入到任何需要的地方
如您所见,此实现与偏执狂宝石提供的开箱即用的实现非常相似。如果您这样做是为了学习并且有很多时间,我建议您构建自己的功能。如果这是需要尽快在专业项目中部署的东西,我建议使用 gem,因为它可能会加快该过程。
这是一篇很好的文章,描述了偏执狂宝石及其功能: 带有偏执狂宝石的轨道软删除