我想對我的資料庫中的每個用戶執行一些代碼。為此,我創建了一個腳本并運行它rails runner myscript.rb
User.all.each do |user|
# code on user
end
如果我的資料庫中有 500 個用戶,這有效,但如果我有 4000 個用戶,我會收到一些錯誤,因為.each給定用戶數量中的一些代碼。(這個數字是虛構的)
出于這個原因,我想以 500 個用戶為間隔執行這個腳本。
如何每 500 個用戶執行一次,直到沒有更多用戶?
uj5u.com熱心網友回復:
使用find_each:
回圈訪問資料庫中的一組記錄(
Scoping::Named::ClassMethods.all例如,使用方法)效率非常低,因為它會嘗試一次實體化所有物件。在這種情況下,批處理方法允許您批量處理記錄,從而大大減少記憶體消耗。
你想說:
User.find_each do |user|
# code on user
end
這將一次加載 1000 個用戶,并將它們一個一個地交給您的“用戶代碼”塊。如果您愿意,可以指定不同的塊大小。
uj5u.com熱心網友回復:
您可以在 while do 回圈下執行此操作,并且可以將用戶物件設定為User.all.sample. 通過這樣做,直到沒有用戶為止,您的腳本將作業然后退出。但是你應該在你的表中添加一個標志。
假設您正在嘗試向所有用戶發送電子郵件,并且您應該有一個欄位用作類似于email_sent.
現在你的用戶物件是 User.all.where(email_sent: true).sample
另一種方法可能是使用用戶查詢作業。通過您的用戶創建一個回圈并獲得該回圈的索引。設定索引amount_of_time 秒以啟動查詢。因此,如果您有 1000 個用戶并且您在用戶之間設定索引2 秒的緩沖區。這將需要 2000 秒。處理所有查詢的作業。
還有另一種解決方案。如果你能更好地解釋你在尋找什么以及你需要什么練習;我可以給你推薦一個更好的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/375018.html
標籤:红宝石轨道 红宝石 rails-activerecord
上一篇:如何理解vw.format中的插槽-VowpalWabbitConditionalContextualBandit
