2014-01-20 29 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之類的紅寶石回調不會被稱爲

相關問題