如何在 Rails 中销毁数百万个依赖对象



在Rails中,我一直使用dependent: :destroy来删除依赖对象。

但是,在以下方案中,它无法正常工作,因为订阅和通知非常大,必须销毁数百万个对象。

Users --> Projects  --> Subscriptions
                   
                    --> Notifications

一些问题是:

  • 删除非常慢,可能需要几个小时(我可以使用后台作业(
  • 我不能在大型表上使用dependent: :delete_all,因为它会长时间阻塞数据库
  • user.destroy将所有删除内容包装在一个事务中(我认为这对于必须同时为其他查询提供服务的数据库没有好处(

Rails 如何处理数百万条记录的大型销毁?是否有任何宝石可以帮助和以更好的方式处理dependent: :destroy(例如在交易之外(?在这种情况下,您会建议什么方法?

从 Rails 6.1 开始,可以做dependent: :destroy_async来破坏后台的关联

 has_many :subscriptions, dependent: :destroy_async

刚刚发布了这个以供将来参考

最新更新