我有一个处理大量计算的应用程序。
不是将相应的值(s)更改为零,而是仅提升NaN
。
before_save :change_nan_to_zero
def change_nan_to_zero
self.attributes.each_pair do |key, value|
if value == Float::NAN
value = 0
end
end
end
或者,也许(总是存在)有更好的方法来处理NaN(特别是将其更改为0
)。 THX!
好的,明白了。问题是实际上没有任何内容保存为NaN
,但是发布NaN
的计算结果(结果未保存到db中)。所以我最终得到了视图的帮助(包含计算结果):
def zero_or_value(value)
if value.is_a?(Float)
value.nan? ? 0 : value
else
value
end
end
谢谢大家的帮助!我真的很感激! @Marek,我相信你的回答是正确的(我已经将它用于我的部分解决方案,我肯定会提供帮助,伙计们!)
答案 0 :(得分:4)
您的解决方案不起作用,因为您只将局部变量value
设置为0
。另外,要检查float是否为nan,您应该使用nan?
方法(与Float :: NAN的比较将不起作用)。你应该做的是:
if value.is_a?(Float) && value.nan?
write_attribute(key, 0)
end
或者,在更短的版本中:
write_attribute(key, 0) if value.nan?
答案 1 :(得分:1)
value
变量包含原始变量的副本:更改它将无效。而是使用键来引用原始号码:
before_save :change_nan_to_zero
def change_nan_to_zero
self.attributes.each_pair do |key, value|
if value == Float::NAN
self.attributes[key] = 0
end
end
end
答案 2 :(得分:1)
您实际上并未设置数据库属性,只是一个局部变量。我想你真的想要这样的东西:
before_save :change_nan_to_zero
def change_nan_to_zero
self.attributes.each_pair do |key, value|
if value == Float::NAN
write_attribute(key, 0)
end
end
end