我有一个表格,有大量字段,我将其作为小数存储在我的数据库中。处理混合数字 - 在模型中?
然而,我想用户能够输入的级分,并且具体地混合数字(例如38 1/2)
This answer提供了一种用于转换混合编号,以分数一个好的解决方案,我已经修改了它,并把它放在一个函数在我的模型:
def to_dec
self.chest = self.chest.split.map { |r| Rational(r) }.inject(:+).to_f
end
而且我已经尝试了validate :to_dec
和before_save :to_dec
调用它。但是,这些都不起作用。
我知道为什么,但不知道如何解决它。
通过使用puts self.chest
我可以知道,在我有机会调整完成后,该值正在转换为数字。进入'10 1/2' 到我的表单和保存,puts self.chest
给了我10.0即使功能就是:
def to_dec
puts self.chest
end
此外,puts '38 1/2'.split.map { |r| Rational(r) }.inject(:+).to_d
给了我38.5,所以我知道这个问题是不是在转换。
我已经将视图输入类型从数字更改为字符串,但我似乎仍然以我的模型中的数字结束。
我被卡住了。
此外,其他一些领域也需要支持混合数字 - 我想以某种方式抽象出来,所以我不需要为每个值编写不同的函数。
我编辑了你的答案'if胸部',因为如果留空即抛出一个错误。真的很有帮助,很好的解释!一个缺点是允许不正确的分数(77/2等),但通过移除Rational()可以很容易地解决这个问题。其中给出了一个小数。最终我可以使用这个[gem](https://github.com/clord/fraction)将其转换回混合编号。谢谢您的帮助! – bookcasey
嗯......我能够解决这个问题,为第一个例子留下一个空白值,但我正在为第二个例子挣扎。我想允许一个空白输入。有任何想法吗?我得到这个错误'未定义的方法'to_d为零:NilClass' – bookcasey
啊啊,好的电话,我没有想过这种情况。我可能会将解析分割为一个单独的方法,如我最近的编辑所示。总的来说,这听起来像你的需求比你的基本'Rational'类复杂一点,或许值得考虑开发一个自定义的'Measurement'类。 –