Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 此回调有什么问题(处理NaN)_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 此回调有什么问题(处理NaN)

Ruby on rails 此回调有什么问题(处理NaN),ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个处理大量计算的应用程序 它不会将相应的值更改为零,而只会引发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)。谢谢 解决了的 好的

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

它不会将相应的值更改为零,而只会引发
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
)。谢谢

解决了的 好的,明白了。问题是,实际上没有任何内容被保存为
NaN
,但发出
NaN
的是计算结果(其结果未保存到db中)。因此,我最终使用了视图帮助器(包含计算结果):


谢谢大家的帮助!我真的很感激@Marek,我相信你的答案是正确的(我已经将它部分用于我的解决方案,当然我会投票寻求帮助,伙计们!)

变量
值包含原始变量的副本:更改它将无效。相反,请使用键引用原始编号:

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

变量包含原始变量的副本:更改它将无效。相反,请使用键引用原始编号:

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

实际上并没有设置数据库属性,只是一个局部变量。我想你真的想要这样的东西:

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

实际上并没有设置数据库属性,只是一个局部变量。我想你真的想要这样的东西:

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

您的解决方案不起作用,因为您只将局部变量
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?

您的解决方案不起作用,因为您只将局部变量
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?


尝试以
value的形式编写。class==Float::NAN
尝试以
value的形式编写。class==Float::NAN
它不起作用的真正原因不是它是原始值的副本,而是因为
value=0
是局部变量赋值。它不起作用的真正原因不是它是原始值的副本,但是因为
value=0
是局部变量赋值。为每个
nan
调用更新查询-我不确定这是否是个好主意。好的一点是,您的
write\u属性
会更好。这里还很早:)为每个
nan
调用了更新查询-我不确定这是否是个好主意。很好,您的
write\u属性
会更好。在这里还早:)答案看起来确实不错,但不知何故,我得到的主键必须是唯一的error@andreydeineko
属性
包含
id
并且您不能设置
id
它是
主键
!尽管设置
id
很奇怪。它不应该是
if
条件。@MarekLipka
attributes
返回
表中的所有列
id
当然,但是
id!=Float::NAN
,所以我想它不应该被设置。答案看起来确实不错,但不知何故,我得到的主键必须是唯一的error@andreydeineko
属性
包含
id
并且您不能设置
id
它是
主键
!尽管设置
id
很奇怪。它不应该是
if
条件。@MarekLipka
attributes
返回
表中的所有列
id
当然,但是
id!=Float::NAN
,所以我想不应该设置它。