2012-11-06 45 views
4

所以我得上使用漂浮了很多(很多「to_f」)的Rails代碼紅寶石。它使用一個數據庫,其中一些數字也存儲爲「float」類型。Ruby on Rails - 如何將代碼從float移植到decimal?

我想遷移此代碼,並只爲十進制數據庫。它是那麼簡單的代碼數據庫中列有「to_d」遷移到小數點(增加一個十進制列,複製浮動欄爲十進制之一,刪除浮動欄,重命名小數列老浮動列名),並更換「to_f」 ?還是我需要做的比這更多?

非常感謝大家 拉斐爾

回答

17

您可以輕鬆地使用移民要做到這一點,和Rails會生成一些代碼爲你。

從命令提示符,創建一個新的遷移:

rails generate migration change_price_column_to_decimal 

Rails會在目錄db/migrate創建遷移。文件名將是一個時間戳,然後是_change_price_column_to_decimal.rb

在生成的遷移,您將添加updown方法到外地轉換:

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到,但如果你處理的產品價格上漲時,這可能不會是太大的問題。

+1

如這裏的說明,':decimal'表示爲內部一個特殊的固定精度型,避免了很多涉及實際使用浮點值的問題。有些數字不能表示爲浮點數,導致近似值和微小但明顯的不精確數量。 – tadman

+0

「當從浮點型轉換爲十進制時,您可能會失去一些精度」。 難道你不是這個意思嗎? – Dennis

+0

@丹尼斯好吧,沒有。如果你從十進制轉換爲浮點數,你會獲得精度,但會失去準確性。如果東西花費1.99美元,那麼存儲1.99是準確的;但1.98999999999999999375851可能更精確,但肯定不太準確,並會造成各種奇怪的錯誤。也可能是我濫用了「精確」這個詞。 –