繁体   English   中英

如何有效删除与另一条记录相关且大于某个阈值的所有记录?

[英]How do I delete all records related another record and greater than a certain threshold efficiently?

我正在尝试为每个用户删除所有早于前99个的通知。 这是我目前在rails中执行的操作:

User.all.each do |u|
  u.notifications.order('created_at DESC').offset(99).destory_all
end

这可以正常工作,但是效率很低。 最后,您将为每个用户查找一个查询,并为每个通知添加一个删除查询。

我将如何在单个查询中执行此操作,或者至少要更有效地执行此操作?

到目前为止看起来还不错。 这是我能想到的一些改进

呼叫用户时,请使用.includes来加载其通知,并使用.find_each进行批处理。

User.includes(:notifications).find_each do |u|
  ...
end

您也可以尝试将呼叫包装在ActiveRecord::Base.transaction块中

ActiveRecord :: Base.transaction做User.all.each做| u | u.notifications.order('created_at DESC')。offset(99).destory_all结束端

这将执行批处理事务,而不是一个接一个的事务。

现在,如果您确实要进行改进,请使用.delete_all而不是.destroy_all 这将导致钱包SQL中的删除。 警告:Ruby回调如before_destroy不会被调用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM