運行原始的SQL查詢:
ActiveRecord::Base.connection.execute("UPDATE table_name set PhoneCol = REPLACE(PhoneCol, '(', '');")
ActiveRecord::Base.connection.execute("UPDATE table_name set PhoneCol = REPLACE(PhoneCol, ') ', '-');")
或你自己說的,使用update_all
:
Model.update_all("'PhoneCol' = REPLACE(PhoneCol, '(', '')")
Model.update_all("'PhoneCol' = REPLACE(PhoneCol, ') ', '-')")
如果你期待撤消更改,那麼你可以創建兩個耙任務:
namespace :phone_column do
desc "Update phone column from (xxx) -xxxx to xxx-xxxx"
task :update => :environment do
Model.update_all("'PhoneCol' = REPLACE(PhoneCol, '(', '')")
Model.update_all("'PhoneCol' = REPLACE(PhoneCol, ') ', '-')")
end
# NOTE: running this task can mess up the data if you have not run the previous task before
desc "Reverse xxx-xxxx to (xxx) -xxxx"
task :reverse => :environment do
Model.update_all("'PhoneCol' = CONCAT('(', SUBSTRING_INDEX(PhoneCol, '-', 1), ') ', SUBSTRING_INDEX(PhoneCol, '-', 2), '-', SUBSTRING_INDEX(PhoneCol, '-', -1))")
end
end
我會建議把這個與up
和down
方法遷移文件,但是這沒有更新這樣的數據的一個很好的方式,即遷移文件應該總是處理模式的變化,而不是在你的數據庫中的數據更新。因爲,隨着項目的增長,當您創建新的遷移時,您將不會有任何其他選擇在不參考其版本號的情況下對該遷移進行回滾,並且如果您(或其他人)錯過了任何機會,您可能會面臨生產服務器上嚴重的數據丟失。這就是爲什麼你的更新腳本應該在rake任務中(這不包括保證你的數據更新是可逆的)。
請看這裏:https://stackoverflow.com/questions/4483049/how-to-execute-a-raw-update-sql-with-dynamic-binding-in-rails – mcfinnigan 2014-11-05 11:58:48
爲什麼你需要Rakefile?你可以使用Rails控制檯做到這一點..對嗎? – 2014-11-05 11:59:44
@ User089247如果這是需要,爲什麼不修復它來自哪裏的實際來源。爲什麼雙重工作? – 2014-11-05 12:05:42