我正在尝试为每个用户删除早于99的所有通知。这是我目前在rails中所做的事情:
User.all.each do |u|
u.notifications.order('created_at DESC').offset(99).destory_all
end
这很好用,但效率非常低。您最终会查找每个用户以及每个通知的删除查询。
我如何在单个查询中或至少更有效地执行此操作?
答案 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回调