simple_from_for 小数精度不保存小数

simple_from_for with decimal precision doesn't save decimals

我正在为我的表单模板使用 simple_form_for,它没有将十进制数字存储到我的数据库 table。当我提交表单时,它会丢弃精度。

这是我的:

我的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

数据库图片

对于我还能做些什么来完成这项工作感到困惑。任何帮助将不胜感激。

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

解决此问题的方法是在迁移中指定精度和比例。所以通过后续迁移更正它:

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

在这种情况下,我们将总位数(精度)设置为 10,保留 2 位小数(比例)。请注意,您可以根据需要选择尺寸 – MySQL 文档为不同组合的存储要求提供了一些指南。

此外,在选择精度和小数位数时,请注意小数位数(最大小数位数)不能大于精度(总位数)。写在这里时这看起来很明显,但如果没有这些翻译括号,很容易变得懒惰并使两个值相同,这将使您得到一个必须小于 1.0 的数字,因为所有 space 都将分配到小数点右侧。

参考:Here