您可以輕鬆地使用移民要做到這一點,和Rails會生成一些代碼爲你。
從命令提示符,創建一個新的遷移:
rails generate migration change_price_column_to_decimal
Rails會在目錄db/migrate
創建遷移。文件名將是一個時間戳,然後是_change_price_column_to_decimal.rb
。
在生成的遷移,您將添加up
和down
方法到外地轉換:
class ChangePriceColumnToDecimal < ActiveRecord::Migration
def up
change_column :products, :price, :decimal, :precision => 15, :scale => 2, null: false
end
def down
# Either change the column back, or mark it as irreversible with:
raise ActiveRecord::IrreversibleMigration
end
end
執行遷移,從命令提示符下運行相應的rake任務:
rake db:migrate
這將爲您轉換數據庫。請記住,從浮點數轉換爲十進制,你會失去一些顯著的數字,這取決於你設置scale
到,但如果你處理的產品價格上漲時,這可能不會是太大的問題。
如這裏的說明,':decimal'表示爲內部一個特殊的固定精度型,避免了很多涉及實際使用浮點值的問題。有些數字不能表示爲浮點數,導致近似值和微小但明顯的不精確數量。 – tadman
「當從浮點型轉換爲十進制時,您可能會失去一些精度」。 難道你不是這個意思嗎? – Dennis
@丹尼斯好吧,沒有。如果你從十進制轉換爲浮點數,你會獲得精度,但會失去準確性。如果東西花費1.99美元,那麼存儲1.99是準確的;但1.98999999999999999375851可能更精確,但肯定不太準確,並會造成各種奇怪的錯誤。也可能是我濫用了「精確」這個詞。 –