[英]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.