具有小数精度的simple_from_for不保存小数

时间:2019-05-15 14:36:24

标签: ruby-on-rails ruby-on-rails-4 simple-form simple-form-for

我将simple_form_for用于表单模板,该模板未将十进制数字存储到数据库表中。当我提交表单时,它会丢弃精度。

这是我所拥有的:

我的schema.rb

create_table "coupons", force: true do |t|
    t.decimal  "amount", precision: 10, scale: 0
end

new.html.slim

.panel-body.padded
        = simple_form_for @coupon, :url => admin_coupons_path  do |f|
          .form-group
            = f.input :amount, as: :string, input_html: { value: number_with_precision(f.object.amount, precision: 8) }, required: true

数据库图片

enter image description here

我对我还能做些什么感到困惑。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:-1)

难题的缺失部分是数据库中小数的精度。默认情况下,上面的代码将在MySQL中创建一个带有10位数字的十进制字段,所有这些数字都位于小数点的左侧。换句话说,将15.37保存到模型将在应用程序中显示15.37,但是当您保存模型时,在数据存储区和重新加载模型时,它将变成15。

解决此问题的方法是在迁移中指定精度和小数位数。因此,请通过后续迁移对其进行纠正:

change_column :table_name_in_plural, :column_name, :decimal, :precision => 10, :scale => 2

在这种情况下,我们将位数(精度)设置为10,小数点后两位(小数位)。请注意,您可以根据需要选择大小-MySQL文档为您提供了一些指导不同组合的存储要求。

此外,在选择精度和小数位数时,请注意小数位数(最大小数位数)不能大于精度(总位数)。在此处编写时似乎很明显,但是括号中没有这些翻译,很容易变得懒惰并使两个值相同,这将使您的数字必须小于1.0,因为所有空间都将分配到小数点右边。

参考:Here