【问题标题】:simple_from_for with decimal precision doesn't save decimals具有小数精度的 simple_from_for 不保存小数
【发布时间】:2019-05-15 14:36:23
【问题描述】:

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

数据库图片

我不知道我还能做些什么来完成这项工作。任何帮助将不胜感激。

【问题讨论】:

  • 控制器中params的值是多少?如果整个字符串值在 params 中提交,那么这不是 simple_form 的问题,而是您如何保存数据的问题。
  • 所以想出了办法。它的 MySQL 规模问题

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


【解决方案1】:

谜题中缺少的部分是数据库中小数的精度。默认情况下,上面的代码将在 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 的数字,因为所有空间都将分配到小数位的右侧。

参考:Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2013-07-17
    • 2015-03-14
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多