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
条件。@MarekLipkaattributes
返回表中的所有列
和id
当然,但是id!=Float::NAN
,所以我想它不应该被设置。答案看起来确实不错,但不知何故,我得到的主键必须是唯一的error@andreydeineko属性
包含id
并且您不能设置id
它是主键
!尽管设置id
很奇怪。它不应该是if
条件。@MarekLipkaattributes
返回表中的所有列
和id
当然,但是id!=Float::NAN
,所以我想不应该设置它。