[英]Running validations when using `update_all`
根據Rails的文檔在這里和這里 ,使用update_all
不做到以下幾點-
updated_at
字段 :limit
和:order
方法 我試圖遍歷我的代碼庫,並刪除update_all
實例,尤其是因為第一點。
有沒有辦法仍然方便update_all
並仍然運行驗證? 我知道我可以遍歷每條記錄並將其保存,但這不僅視覺上更混亂,而且效率更高,因為它執行的是N條SQL語句而不是1條
# before
User.where(status: "active").update_all(status: "inactive")
# after
User.where(status: "active").each { |u| u.update(status: "inactive") }
謝謝!
編輯:我正在使用Rails 4.2
不幸的是, update_all
更快,因為它沒有為每個記錄實例化一個活動的記錄對象,而是直接處理數據庫。 在您的情況下,由於需要驗證和回調,因此需要實例化對象,因此,最好的選擇是以1000個為單位進行迭代,並按最初所示執行更新。 如:
User.where(status: "active").find_each { |u| u.update(status: "inactive") }
find_each
方法一次僅加載1000個對象,因此不會使垃圾收集器超載。 如果您有成千上萬行的批量記錄,我會考慮返回update_all或將更新移至后台任務,因為部署時它很容易導致超時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.