2017-01-09 224 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 %>