簡體   English   中英

使用`update_all`時運行驗證

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

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