2014-01-20 27 views
0

我试图删除每个用户比99年前更早的所有通知。这是我目前在做的事情:如何删除所有与另一条记录相关的记录并高于某个阈值?

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

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

我该如何去做一个单一的查询或至少更有效?

回答

0

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

当呼叫用户时,请使用.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')。偏移(99).destory_all 端 端

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

现在,如果你真的作出改进,使用.delete_all代替.destroy_all。这将导致钱包SQL中的删除。 警告:before_destroy之类的红宝石回调不会被称为

相关问题