2012-10-08 102 views
2

我想返回mycollection.first.user.name,但mycollectionmycollection.first可能爲零。下面的代碼很難看,但作品:返回前檢查多個條件

if mycollection && mycollection.first && mycollection.first.user 
    mycollection.first.user.name 
end 

什麼是Ruby方式?

回答

0

如果你碰巧使用Rails,將它添加到Object的方法稱爲try這可能幫助:

mycollection.try(:first).try(:user).try(:name) 

,將調用firstusername順序,但如果在任何一個值,鏈條是nil,它只會返回nil而不會引發異常。

如果你不使用Rails,你可以很容易把它定義自己:

class Object; def try(method,*args,&block); send(method,*args,&block); end end 
class NilClass; def try(method,*args,&block); nil; end end 
0

有些人不嘗試太熱衷(),但可以肯定的是,你可能會喜歡的一種方法。

name = mycollection.try(:first).try(:user).try(:name) 

如果任何內容爲零,或者將返回名稱的值,名稱將爲零。

此外,您可能需要重構你的模型,這樣你可以調用這樣的事情:

item.user_name 

class ItemClass 
    def user_name 
    user.try(:name) 
    end 
end 

與項目是集合中的第一個。

name = if mycollection && item = mycollection.first 
    item.user_name 
end 
+0

有點晚=)看起來像亞歷克斯有一個更詳細的答案。 –

0

在純Ruby,你可以這樣做:

if mycollection && mycollection.first.respond_to?(:user) 
    mycollection.first.user.name 
end 

這是因爲,如果mycollection是一個空數組,mycollection.first將返回nil:

irb(main):002:0> nil.respond_to?(:user) 
false