2014-11-05 41 views
0

我有一個處理大量計算的應用程序。這個回調有什麼問題(與NaN打交道)

而不是將相應的值更改爲零它只是提高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 

或者,也許(總是有)有一個更好的方式來處理與南(特別是無處不在將其更改爲0)。謝謝!

求解

好的,明白了。問題是實際上沒有保存爲NaN,但它是發佈NaN的計算(結果未保存到分貝)。所以,我已經結束了與幫手意見(含計算結果):

def zero_or_value(value) 
    if value.is_a?(Float) 
     value.nan? ? 0 : value 
    else 
     value 
    end  
    end 

謝謝大家的幫助!我非常感謝! @Marek,我相信你的回答是正確的(我已經用它來解決我的問題了,我肯定會幫你解決問題的,夥計們!)

+0

嘗試寫爲'value.class ==浮動:: NAN' – Gowri 2014-11-05 08:52:42

回答

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 
+0

真正的原因這是行不通的ISN不是它是原始值的副本,而是因爲'value = 0'是局部變量賦值。 – 2014-11-05 08:55:09

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 
+0

爲每個'nan'調用UPDATE查詢 - 我不確定這是個好主意。 – 2014-11-05 08:56:11

+0

好點,你的'write_attribute'會更好。 :)在這裏:) – 2014-11-05 08:57:13

4

您的解決方案不起作用,因爲你只設置局部變量value0。此外,要檢查float是否爲nan,則應使用nan?方法(與Float :: NAN進行比較將不起作用)。你應該做的是:

if value.is_a?(Float) && value.nan? 
    write_attribute(key, 0) 
end 

,或者在較短的版本:

write_attribute(key, 0) if value.nan? 
+0

答案真的看起來不錯,但不知何故我得到PRIMARY KEY必須是唯一的錯誤 – 2014-11-05 09:08:32

+0

@andreydeineko'屬性'包含'ID',你不能設置'ID'它是'PRIMARY KEY'! – 2014-11-05 09:09:23

+0

雖然很奇怪'id'正在設置。它不應該通過'如果'條件。 – 2014-11-05 09:10:25