簡體   English   中英

如何有效刪除與另一條記錄相關且大於某個閾值的所有記錄?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM