2015-12-21 70 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