2017-01-09 222 views
1

我正在構建一個Rails應用程序,該應用程序允許用戶通過向UI中輸入值來編目輪胎。當我創建了tire類,我把它作爲我不確定我是否正確應用Rails更改遷移

class CreateArticles < ActiveRecord::Migration[5.0] 
    def change 
    create_table :tires do |t| 
     t.decimal :price 
     ... 
    end 
end 

當我跑我才發現自己忘了指定decimal屬性的精確度和規模的計劃。這導致該程序是無法接受非整數值和因爲我是如此的程序更遠的地方顯示的.0附加的所有值,我決定寫另一個移民通過編寫以下遷移只是改變pricefloat

class ChangeTiresToFloat < ActiveRecord::Migration[5.0] 
    def change 
    change_column :tires, :price, :float 
    end 

運行db:migrate後,程序的行爲沒有變化。這是否應該使UI可以接受浮點值?

編輯:訴諸使得price列的浮點值之前,我曾嘗試用這種遷移添加缺少的屬性來解決decimal值:

class MoneyDecimalFix < ActiveRecord::Migration[5.0] 
    def change 
    change_column :tires, :price, :decimal, :precision => 8, :scale => 2 
    end 
end 

滾滾向前遷移,程序的行爲後,仍然沒有改變。

+1

不要使用浮動價格。 http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency – max

+1

與@Max你可以使用一個錢庫像https://github.com/RubyMoney同意/ money-rails –

+0

儘管我打算在此之後切換到優化更新的Money庫,但我首先想知道我的錯誤在實施遷移中。爲什麼將它向前滾動會導致程序行爲不變。 –

回答

0

雖然可以使用change_column遷移編輯價格值包括decimal屬性的規範,因爲create_table是可逆的遷移,這是明智的,而不是卷遷移回手動執行的變化,最終閱讀

t.decimal :price, :precision => 8, :scale => 2

再向前滾一遍遷移。

但值得注意的是,儘管在遷移中正確定義了price列是必不可少的一步,但它並沒有解決表單不接受小數值的問題。

該錯誤最終在我的意見。在Rails中,該number_field標籤,自身的,不會有text_field標籤接受十進制值,則必須將「組合拳」,以這樣這樣做:

<%= f.number_field :price, class: :text_field, step: :any %>