2017-10-06 70 views
0

我在Rails-React应用程序中创建了一些表数据。如何让Rails接受小数?

我在控制台这里创建该片段的数据:

2.3.3 :024 > Crop.create date: Date.today, cropname: 'Radishes', ismetric: false, bagspackaged: '20', unitweight: '0.5', totalweight: '10' 

今天,我意识到,Rails的不接受0.5小数的unitweight不管我如何努力在控制台更新它,它不保存。

这是我schema.rb文件:

ActiveRecord::Schema.define(version: 20171004224716) do 

    # These are extensions that must be enabled in order to support this database 
    enable_extension "plpgsql" 

    create_table "crops", force: :cascade do |t| 
    t.date "date" 
    t.string "cropname" 
    t.boolean "ismetric" 
    t.integer "bagspackaged" 
    t.integer "unitweight" 
    t.integer "totalweight" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

end 
+2

你有单位定义为一个整数。不知道你期望通过给它分配0.5。 – lurker

回答

1

我会避免回滚你的庄稼表,它只是更多的工作。它是由你决定。

我只想做:

rails g migration ChangeUnitweightToFloat 

在这个文件中我将配置像这样:

class ChangeUnitweightToFloat < ActiveRecord::Migration 
    def change 
    change_column :crops, :unitweight, :float 
    end 
end 

有了这两个步骤,你应该去走。 为了将来的参考,请记住,如果你想使用小数,它可以是t.decimal或t.float。

1

这不是一个小数,它是一个字符串。不要在数字文字中加引号。

Crop.create(
    date: Date.today, 
    cropname: 'Radishes', 
    ismetric: false, 
    bagspackaged: 20, 
    unitweight: 0.5, 
    totalweight: 10 
) 
1

你可以使用一个decimal(或float)型的,而不是一个整数字段:

create_table "crops", force: :cascade do |t| 
    t.decimal "unitweight" 
end 

,然后不要使用围绕价值语录:

2.3.3 :024 > Crop.create date: Date.today, cropname: 'Radishes', ismetric: false, bagspackaged: '20', unitweight: 0.5, totalweight: '10' 
+0

我是否需要回滚初始迁移? – Ale

+0

您可以回滚或创建另一个将删除该列remove_column的迁移,然后使用add_column – Cyzanfar

4

两个问题这里

  • 首先,您已将数据类型integer设置为unitweighttotalweight,而您应该给它decimalfloat以接受和存储分数。具有精度的数据类型更好,因为它会为您提供更准确的结果,如下面的注释部分所述。 当用户decimal时,您可以通过scale属性控制其大小(即位数),并且可以通过称为precision的另一个属性控制小数位数。

    这里有一个例子

    add_column :tickets, :price, :decimal, precision: 2, scale: 5

    这将允许你存储小数这样的60.00,80.99和100.00

  • 您传递stringinteger第二,它是不是一个问题因为导轨会将其转换为integer,只要它是有效的integer,否则它将是0。但通常这不是一个好习惯。

+1

'decimal“的新列以指定的精度优于float。 – tadman

+0

@tadman肯定这是我给他的两个选择,但你说得对,我应该这么说。因为你已经说过不需要重新写一遍。 –

+3

绝对没问题。当'0.5'出现为'0.499999994812'时,人们只会被纯粹的浮游物一直燃烧。 – tadman

相关问题