这个回调有什么问题(处理NaN)

时间:2014-11-05 08:47:37

标签: ruby-on-rails ruby

我有一个处理大量计算的应用程序。

不是将相应的值(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,我相信你的回答是正确的(我已经将它用于我的部分解决方案,我肯定会提供帮助,伙计们!)

3 个答案:

答案 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