2015-10-19 61 views
1

負我下面的步驟描述here遷移小數列默認值0變爲模式

對於一個小的背景下,這個Web應用程序是一個拍賣管理系統。 Auction類中的amount_raised列應該表示美元金額,即拍賣時的金額。默認情況下,我想要它是$0.00。在auction.rb文件我的設置方法如下:

def amount_raised=(val) 
    currency = val.to_s.gsub(/[-$,]/,'').to_f if val.present? 
    write_attribute(:amount_raised, currency) 
end 

我試圖作出的第一個遷移如下:

change_column_default :auctions, :amount_raised, from: nil, to: 0.00 

但是,這種變化導致我schema.rb文件中的以下(精度和規模已經在那裏):

t.decimal "amount_raised", precision: 5, scale: 2, default: -0.0 

我想再拍遷移更改默認從-0.0nil(因爲我想如果我不能得到0的工作,我可以通過檢查零並使其打印$ 0.00來在視圖中執行正確的格式),但默認值保持在-0.0。

我試圖回滾遷移,但他們拋出異常爲「不可逆遷移」,這是我試圖通過使用from: nil, to: 0.00開始避免。

我的問題是,遵循Rails指南的格式,我做錯了什麼?解決這個問題的最好方法是什麼?

回答

1

只要運行一個空遷移:

rails generate migration AddAmountRaisedToAuctions 

然後你change方法中添加下面的代碼:

def change 
    change_column :auctions, :amount_raised, :decimal, :null => false, :default => 0 
end 

現在運行耙分貝:遷移。

+0

這個列已經存在了嗎?這是否會破壞已存在的非零值的數據? –

+0

如果該列已經存在,而不是'add_column',則它將是'change_column'。它不會破壞現有的數據,但對此不確定。 – nik

+0

這工作!任何想法爲什麼我的原始方法使它不高興? –