2012-10-08 3 views
2

mycollection.first.user.name을 반환하고 싶지만 mycollection 또는 mycollection.first은 0이 될 수 있습니다. 다음 코드는 추악하지만 작동합니다 :반송하기 전에 여러 조건 확인

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

루비 방법이란 무엇입니까?

답변

0

당신이 레일을 사용하는 일이 있다면, 그것은 도움이 될 수 있습니다 try라는 Object에 방법을 추가합니다

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

순서 first, username를 호출합니다,하지만 임의의 값의 경우 체인이 nil이면 예외를 throw하지 않고 nil을 반환합니다.

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) 

이름이 nil이거나 이름의 값을 반환하면 이름이 nil이됩니다.

또한, 당신은 당신이 이런 식으로 뭔가를 호출 할 수 있도록, 모델을 리팩토링 할 수 있습니다 : 항목이 컬렉션의 첫 번째 인과

item.user_name 

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

. 순수 루비에서

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

비트가 너무 늦게 =)의 모습 : mycollection가 빈 배열 인 경우, mycollection.first이 전무를 반환하기 때문에

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

의 그 Alex는 좀 더 자세한 대답을했습니다. –

0

, 당신은 할 수 :

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