我不确定我是否正确应用Rails更改迁移

时间:2017-01-09 02:11:27

标签: ruby-on-rails ruby migration decimal ruby-on-rails-5

我正在构建一个Rails应用程序,允许用户通过在UI中输入值来编目轮胎。当我创建tire类时,我将其设为

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

当我运行程序时,我意识到我忽略了指定decimal属性的精度和比例。这导致程序无法接受非整数值并显示.0附加的所有值因为我在程序上走得太远,所以我决定编写另一个迁移,只需将price更改为通过编写以下迁移来float

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 个答案:

答案 0 :(得分: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 %>