Ruby on rails 在Rails中高效删除所有依赖项
我正在尝试对一个ActiveRecord关系执行Ruby on rails 在Rails中高效删除所有依赖项,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在尝试对一个ActiveRecord关系执行delete\u all,该关系有很多行和一个级别依赖项 当我使用destroy\u all时,它当然非常慢,因为它迭代了整个关系 当使用delete\u all时,我无法找到一种方法来指定rails也应该删除(而不是销毁)它的依赖项 这就是我所知道和尝试的: 我有一个成员模型和一个消息模型 在成员模型中,我有 有很多:消息、与::成员相反的、依赖的::销毁 我认为将上述内容更改为dependent::delete_all将使用一个查询删除所有依赖
delete\u all
,该关系有很多行和一个级别依赖项
当我使用destroy\u all
时,它当然非常慢,因为它迭代了整个关系
当使用delete\u all
时,我无法找到一种方法来指定rails也应该删除(而不是销毁)它的依赖项
这就是我所知道和尝试的:
成员
模型和一个消息
模型有很多:消息、与::成员相反的、依赖的::销毁
dependent::delete_all
将使用一个查询删除所有依赖项(删除[array of members to delete]中的成员ID所在的消息)-它没有这样做,而是由于外键错误而失败# Define the Member collection we want to delete
members = Member.where comment: 'debug'
# Get all the IDs from it
ids = members.pluck :id
# Delete all the dependent Message objects first
Message.where(member_id: ids).delete_all
# Then delete the Members
members.delete_all
这是快速的,并正确地导致两个删除查询
我的问题是:
- 难道
定义不应该为我这样做吗dependent::delete_all
- 有没有更像Rails的方法?感觉就像我在手动做一些rails本身应该处理的事情
destroy
方法。当时,我做了广泛的研究,做了你所做的事情。如果您最终覆盖了destroy
,请确保在事务中包装您的方法。如果您的某个依赖项出现错误,这将通过回滚删除来保护您
顺便说一句,你可以链接你的位置,从数据库中拨出并保存一个电话
member\u id=member.where(comment:'debug').pull(:id)
您始终可以在模型中编写方法并删除依赖项。通过绑定该方法以删除事件,可以自动调用该方法。因此,无论何时在父级上触发delete,都会自动调用该方法并首先删除子级。确保在删除主父项之前先删除从属项。在销毁之前
用于销毁的回调。。。。但仍然需要2个SQL查询。。。我想没有别的解决办法了。谢谢。我没有覆盖销毁
——对我来说似乎很危险。我希望我错过了一些东西,rails有一个内置的方法来有效地做到这一点。