【问题标题】:Ruby/Rails - How can you validate against decimal scale?Ruby/Rails - 你如何验证十进制?
【发布时间】:2014-06-07 15:57:36
【问题描述】:

如何验证小数位数?例如,假设我们要存储一家酒店的评分,小数点后最多保留 2 个小数点。 4.34。 3.76。等等

我已经在线阅读了根据您绑定到列的精度/比例截断的 sqlite。因此,如果您的精度为 3,则为 2,然后输入 1.34567 将存储 1.35。

但是,我使用的是 postgres,但事实并非如此。我输入了这个,尽管我的精度为 3,但数据库以某种方式存储了完整的东西。

t.decimal :my_column, precision: 3, scale: 2

那么,我该如何针对这种事情进行验证,为什么 postgres 一开始就存储超过 2 个小数位?

【问题讨论】:

    标签: ruby-on-rails ruby validation decimal


    【解决方案1】:

    小数位数仅在值是字符串时才重要。将其转换为数字后,无论它有多少个小数,零个或多个。

    因此,执行此验证的时间是在输入时(当它是一个字符串时,因为用户的 all 输入是 always 一个字符串),然后强制执行正确的显示在输出上,当它再次是一个字符串时。在所有其他时间,您不必担心小数位数。

    就 Rails 而言,您可以使用访问器方法为您进行一些验证:

    def my_column=(value)
      if value[/\A\d+\.\d\d\z/]
        write_attribute :my_column, value
      else
        errors.add(:my_column, :invalid) 
      end
    end
    

    你不能使用传统的验证器作为字符串->十进制转换将在你的验证器运行之前发生。

    【讨论】:

      【解决方案2】:

      一种简单的方法是将评分乘以 100 并将其存储为整数。那么你的验证应该是微不足道的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多