2015-12-21 67 views
3

我有一些代碼,看起來與此類似:紅寶石救援和最佳實踐語法

foo = SomeActiveRecordModel.where(bar: 10).first.foo rescue '' 

一旦我開始使用Rubocop它是在我喊救援語法那裏。所以我想還有其他至少有兩種方法來寫這個代碼它們是:

foo = 
begin 
    foo = SomeActiveRecordModel.where(bar: 10).first.foo 
rescue NoMethodError 
    '' 
end 

和:

foo = SomeActiveRecordModel.where(bar: 10).first 
foo.present? ? foo.foo : '' 

以下哪種方式將是首選,或者是有沒有最好的替代方法?

+0

出於好奇,你在哪裏使用它?我看到所有三個答案都是非常出色的。但是如果你在一個控制器中使用它,可能會把'where'方法調用移動到'SomeActiveRecordModel'中的'scope'或'class method'可能更好。 – vee

+0

這是在類方法中使用的。它被用來獲取數據庫中存在的任何規則,並將這些規則應用於sql查詢。 – CarlyL

回答

5

拇指通常的規則是,例外情況應特殊情況下,那些你不控制的正常流程預計將保留。首先,他們通常比替代品慢。

這就是我希望爲自己的方案:

foo = SomeActiveRecordModel.find_by_bar(10).try(:foo) || '' 
+0

甚至是'SomeActiveRecordModel.find_by(bar:10).try(:foo)|| '''或者'SomeActiveRecordModel.find_by(bar:10).try(:foo).to_s'作爲'foo'可能是一個字符串。 –

+0

我以前見過這樣的語法,但那甚至沒有跨過我的想法嘗試。感謝您的回答以及您花時間描述它的時間。 – CarlyL

3

從現在開始,這兩種方法都不是首選方式。首選的辦法是:

foo = SomeActiveRecordModel.where(bar: 10).first&.foo || "" 
+4

我覺得這個新運營商會被濫用。 :) –

+0

哇,哇,這是什麼時候發生的?和*爲什麼*? – zetetic

+1

@zetetic:[ruby 2.3](http://nithinbekal.com/posts/ruby-2-3-features/)。因爲原因。 –

9

異常處理是,嗯,處理例外情況。顯然,有時可能不會有記錄。處理它與捕捉NoMethodError絕對是錯誤的方式來做到這一點。首先,它不僅會捕獲「無法使用nil的方法:NilClass」,而且會捕獲所有其他「無法使用」的錯誤,這可能會發生(錯別的地方等)。

因此,「記錄未找到」是一個非例外的情況,您必須按照某種條件處理它。

foo = SomeActiveRecordModel.where(bar: 10).first 
return '' unless foo 
foo.bar 
+0

這很有道理。感謝您抽出寶貴時間教育我。 – CarlyL