2013-10-22 35 views
3

重命名某個鍵我有2000項,其中的每一個是信息的哈希看起來像這樣的一列car_details在哈希

{"capacity"=>"0", 
"wheels"=>"6", 
"weight"=>"3000", 
"engine_type"=>"Diesel", 
"horsepower"=>"350", 
"fuel_capacity"=>"35", 
"fuel_consumption"=>"30"} 

有些汽車有更多的細節,一些較少。我想在每輛有鑰匙的汽車上將"fuel_consumption"鑰匙重命名爲"mpg"

+1

這是數據庫中的「列」嗎? (即,這個哈希序列化?)或者你是否只是在內存中進行這種操作? – Olives

+0

它在數據庫上,它是一個HashWithIndifferentAccess。 – Ashbury

回答

1

據我所知,沒有簡單的方法用原始SQL大量更新數據表中的序列化列。我能想到的最好的辦法是做這樣的事情:

Car.find_each do |car| 
    mpg = car.car_details.delete("fuel_consumption") 
    car.car_details["mpg"] = mpg if mpg 
    car.save 
end 

這是假設你正在使用的Active Record和你的模式被稱爲「汽車」。

1

那麼,以前的答案會產生2000個請求,但您可以使用REPLACE函數。 MySQL和PostgreSQL的有,所以這將是這樣的:

Car.update_all("car_details = REPLACE(car_details, 'fuel_consumption', 'mpg')") 

看一看的條件的update_all方法。

另請參閱PostgreSQL string functionsMySQL string functions

+0

我剛剛在480 000行的本地mysql數據庫上檢查了這個查詢,查詢耗時14秒。 –

+0

如果沒有fuel_consumption鍵,您會通過哪些選項跳過car_details? – Ashbury

+0

好吧,它不會更新根本不包含fuel_consumption的行,所以你不需要任何附加條件 –