我必須根據出生日期欄中的值更新年齡欄。有數千條記錄需要更新。如何更新數千條記錄
我該如何使用導軌進行此操作?
這是正確的做法嗎?
User.update_all(:age => some_method);
def some_method
age = Date.today.year - dob.year
end
我必須根據出生日期欄中的值更新年齡欄。有數千條記錄需要更新。如何更新數千條記錄
我該如何使用導軌進行此操作?
這是正確的做法嗎?
User.update_all(:age => some_method);
def some_method
age = Date.today.year - dob.year
end
是的,update_all
是正確的方法,但不是,你不能這樣做。你的some_method
只會被調用一次來建立數據庫調用(我假設你堅持數據庫)。然後你會得到一個錯誤,因爲dob
將不會在User
類的範圍內被識別。
您需要將您的日期邏輯轉換爲SQL函數。
喜歡的東西(用於MySQL的):
User.update_all("age = year(now()) -
year(dob) -
(DATE_FORMAT(now(), '%m%d') < DATE_FORMAT(dob, '%m%d'))")
(NB的DATE_FORMAT東西是讓你得到人們的正確年齡誰的生日是在今年比當前日期晚 - 看到this question更多。詳細信息)
另一種選擇是使用rails中的批處理功能之一。
User.where(some_condition).find_in_batches do |group_of_users|
# some logic
# e.g. group_of_users.update_all(:age => some_logic)
end
這會鎖定你的數據庫更少的時間。請注意,你幾乎總是應該更新一個條件。我想不出有很多情況下,每次發生什麼事情時都想更新整個表格。
有幾個選項結賬rails docs或api。
你的查詢是正確的。
有很多方法可以批量更新記錄。
但是,我認爲你的查詢是最好的。因爲它是支持所有數據庫的所有條件的rails查詢。
比一個屬性
Model.update_all(:column1 => value1, :column2 => value2, ........)
或
您可以使用更新更多:
Model.update_all("column1 = value1, column2 = value2, ........")
它是不是如果有回調觸發 – apneadiving
好一點。如果還有其他邏輯掛起,那麼你需要迭代用戶。確保你分批次做。 – Shadwell