2012-09-11 2 views
1

위임의 이점은 무엇입니까? 편의 방법 이외의 추가적인 이유가 있습니까? 모델의 간단한 래퍼 메서드와 어떻게 비교됩니까? 대표없이레일 위임자 대 래퍼 메서드

내가 가진 것 :

Class Goal 
    belongs_to :user 
end 

Time.now.in_time_zone(goal.user.timezone) 

을 지금 대표로, 이점에있다 :

Class Goal 
    belongs_to :user 
    def tz 
    self.user.timezone 
    end 

    ... 
end 

Time.now.in_time_zone(goal.tz) 

은 내가 선호하는 생각 : 래퍼 방법 대

Class Goal 
    belongs_to :user 
    delegate :timezone, :to => :user 

    ... 
end 

Time.now.in_time_zone(goal.timezone) 

래퍼 메서드는 임의의 별칭을 지정할 수 있기 때문에 (아마도 rtfm 인 경우 del 뿐만 아니라 egate). 다른 일이 여기에 있습니까? (위임 된 키를 기반으로 질의 할 수있는 것 같지 않음)

답변

3

2 개는 다소 비슷합니다. 유일한 차이점은 nil 객체에 위임 할 경우 알려주는 약간의 예외 처리 코드입니다. .

def timezone(*args, &block) 
    user.__send__(:timezone, *args, &block) 
rescue NoMethodError 
    if user.nil? 
    raise "Goal#timezone delegated to user.timezone, but user is nil: #{self.inspect}" 
    else 
    raise 
    end 
end 

당신은 임의의 별칭을 사용할 수 없지만 당신이 prefix를 제공 할 수 있습니다 : 귀하의 예제를 사용하려면, delegate :timezone, :to => :user이 시간대 방법을 생성합니다. allow_nil 옵션을 사용하여 대리자 개체가 nil 일 때 발생하지 않는 약간 다른 버전의 메서드를 생성 할 수도 있습니다.

자세한 내용은 delegate documentation 또는 delegate source code을 참조하십시오.