在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
刚刚发布了这个以供将来参考