这是一个非常愚蠢的问题,我觉得我一定错过了一些简单的事情。我有一个表格quantity
场地。人们在输入数量时不断输入逗号(例如,他们输入12,000
表示一万二千)所以我想在保存数量之前去掉逗号(12000
在示例中)转换为数据库中的整数列。
到目前为止我已经尝试了两种方法。按照建议重写 setter 方法在这个问题中 https://stackoverflow.com/q/6541864/574190
def quantity=(num)
num.gsub!(',', '') if num.is_a?(String)
self[:quantity] = num.to_i
end
这在某种意义上是有效的。如果我输入12,000
在数量字段中并提交表格,我得到12000
在数据库中。问题是它也绕过了所有quantity
验证。例如,我不再可以验证数量值的存在。不是很好。
我还尝试使用验证前回调(而不是覆盖设置器):
before_validation :sanitize_quantity
def sanitize_quantity
# Doesn't wok because quantity.to_i already called by this point.
end
这不起作用,因为当数量达到回调方法时,Rails 已经调用了to_i
在上面。这意味着12,000
将被截断为12
当它到达回调时。再一次,不好。
除了在客户端删除逗号之外,我还能尝试什么?
最后一点,我知道这本质上是一件愚蠢的事情,因为某些国家以不同的方式使用句号和逗号。无论如何我仍然需要这样做。
使用类型强制
如果我正确理解你的问题,那么你正试图将字符串强制转换为数字。如果是这样,您可以使用显式强制转换,如下所示:
validates :quantity, presence: true, numericality: true
def quantity=(num)
self[:quantity] = num.to_s.scan(/\b-?[\d.]+/).join.to_f
end
测试和示例
看看这是如何工作的,您可以在控制台尝试以下操作。
# String as input.
number = '12,956.05'
number.to_s.scan(/\b-?[\d.]+/).join.to_f
=> 12956.05
# Float as input.
number = 12956.05
number.to_s.scan(/\b-?[\d.]+/).join.to_f
=> 12956.05
# Using an ActiveRecord object.
q = Quantity.new quantity: '12,956.05'
=> #<Quantity id: nil, quantity: 12956.05, created_at: nil, updated_at: nil>
q.save
=> true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)