2014-03-24 143 views
0

我必須根據出生日期欄中的值更新年齡欄。有數千條記錄需要更新。如何更新數千條記錄

我該如何使用導軌進行此操作?

這是正確的做法嗎?

User.update_all(:age => some_method); 

def some_method 
    age = Date.today.year - dob.year 
end 

回答

1

是的,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更多。詳細信息)

+0

它是不是如果有回調觸發 – apneadiving

+1

好一點。如果還有其他邏輯掛起,那麼你需要迭代用戶。確保你分批次做。 – Shadwell

0

另一種選擇是使用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 docsapi

0

你的查詢是正確的。

有很多方法可以批量更新記錄。

但是,我認爲你的查詢是最好的。因爲它是支持所有數據庫的所有條件的rails查詢。

比一個屬性

Model.update_all(:column1 => value1, :column2 => value2, ........) 

您可以使用更新更多:

Model.update_all("column1 = value1, column2 = value2, ........")