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

时间:2018-01-26 08:58:54

标签: ruby-on-rails rails-activerecord

在Rails中,我总是使用dependent: :destroy删除依赖对象。

然而,在以下情况下,它无法正常工作,因为订阅和通知非常庞大,必须销毁数百万个对象。

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

有些问题是:

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

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

1 个答案:

答案 0 :(得分:2)

从 Rails 6.1 开始,可以执行 dependent: :destroy_async 在后台销毁关联

 has_many :subscriptions, dependent: :destroy_async

刚刚发布以供将来参考