我在Rails-React应用程序中创建了一些表数据。
我在控制台中创建了这段数据:
2.3.3 :024 > Crop.create date: Date.today, cropname: 'Radishes', ismetric: false, bagspackaged: '20', unitweight: '0.5', totalweight: '10'
今天我意识到Rails不接受单位重量的0.5十进制,无论我如何尝试在控制台中更新它,它都不会保存。
这是我的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
答案 0 :(得分:3)
这里有两个问题
首先,您已将数据类型integer
提供给unitweight
和totalweight
,而您应该按顺序提供decimal
或float
接受和存储分数。具有精确度的decimal
数据类型更好,因为它可以为您提供更准确的结果,如下面评论中所述'部分。
当你使用decimal
时,你可以通过精确度来控制它,它是一个数字中的总位数,而scale是小数点后面的位数。
这是一个例子
add_column :tickets, :price, :decimal, precision: 5, scale: 2
这将允许您存储十进制数字,如60.00,80.99和100.00
其次,您将string
传递给integer
,这不是问题,因为只要它是有效的integer
,rails就会将其转换为integer
否则它将是0
。但一般来说这不是一个好习惯。
答案 1 :(得分:1)
这不是小数,它是一个字符串。不要在数字文字周围加上引号。
Crop.create(
date: Date.today,
cropname: 'Radishes',
ismetric: false,
bagspackaged: 20,
unitweight: 0.5,
totalweight: 10
)
答案 2 :(得分: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'
答案 3 :(得分:1)
我会避免回滚你的庄稼表,这只会是更多的工作。这取决于你。
我会这样做:
rails g migration ChangeUnitweightToFloat
在该文件中我会这样配置:
class ChangeUnitweightToFloat < ActiveRecord::Migration
def change
change_column :crops, :unitweight, :float
end
end
通过这两个步骤,你应该去。 为了将来参考,请记住,如果你想使用小数,它将是t.decimal或t.float。