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

时间:2014-01-20 16:42:18

标签: sql ruby-on-rails postgresql

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

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

这很好用,但效率非常低。您最终会查找每个用户以及每个通知的删除查询。

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

1 个答案:

答案 0 :(得分:0)

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

致电用户时,请使用.includes急切加载他们的通知,并使用.find_each进行批处理。

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

您也可以尝试在ActiveRecord::Base.transaction

中打包

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

这将执行批处理事务,而不是逐个执行。

现在,如果您真的想要改进,请使用.delete_all代替.destroy_all。这将导致钱包SQL中的删除。 警告:不会调用像before_destroy这样的Ruby回调

相关问题