레일

2010-03-23 4 views
43

그래서 나는 내가 속한위한 그러나 같은 일을 달성하기 위해 노력하고있어레일

def custom_getter 
    return self[:custom_getter] || some_default_value 
end 

를 사용하여 액티브 오브젝트의 속성에 대한 기본 게터를 재정의하는 방법을 알고 협회. 예를 들어.

class Foo < AR 
    belongs_to :bar 

    def bar 
    return self[:bar] || Bar.last 
    end 
end 

class Bar < AR 
    has_one :foo 
end 

내가 말할 때 :

f = Foo.last 

내가 그 연관이 아직 존재하지 않는 경우 오히려 무기 호보다, 마지막 줄을 반환 f.bar 방법을 가지고 싶습니다.

그러나 이것은 작동하지 않습니다. 그 이유는 self [: bar]가 항상 정의되지 않기 때문입니다. 실제로는 self [: bar_id]입니다. 그러나이 항상 바 이미 확실히 적합하지 않은, 인출 된 경우에도 DB를 호출을 만들 것입니다

def bar 
    if self[:bar_id] 
    return Bar.find(self[:bar_id]) 
    else 
    return Bar.last 
    end 
end 

:

내가 좋아하는 순진한 뭔가를 할 수 있습니다.

누군가는 belongs_to 속성이 한 번만로드되고 설정되지 않은 경우 기본값이있는 관계를 갖는 방법에 대한 통찰력을 가지고 있습니다.

답변

70

alias_method는 여기에 친구입니다.

alias_method :original_bar, :bar 
def bar 
    self.original_bar || Bar.last 
end 

이 작동하는 방법은 "원래 줄"로 기본 "바"방법을 별칭을하고 "바"의 자신의 버전을 구현하는 것입니다. original_bar를 호출하면 nil이 반환되고 마지막 바 인스턴스가 반환됩니다.

+0

당신은 그와 루프가없는 D : – shingara

+0

아니요, "bar"의 새 이름 인 "original_bar"를 호출합니다. –

+0

매력처럼 일했습니다! 고마워요 – brad

10

랜디의 대답에 자리이지만, 쓰기 쉬운 방법은 alias_method_chain 사용하여, 거기 :


def bar_with_default_find 
    self.bar_without_default_find || Bar.last 
end 
alias_method_chain :bar, :default_find 

두 가지 방법 만듭니다 - bar_with_default_findwith 방법 bar_without_default_find 및 별칭 bar을. 그렇게하면 명시 적으로 하나를 호출하거나 기본값을 그대로 둘 수 있습니다.

+0

'_without_default_find'를 사용하여 원래의 할당 방법 개념을 사용할 수 있기 때문에 멋진 솔루션입니다. 제가 일할 수 있었던 유일한 사람 이었습니까? 감사 – grant

13

나는 "최고"를 사용하면이 당신을 도와 내가 희망하는 가장 좋은 방법

def bar 
    super || Bar.last 
end 

것으로 나타났습니다? 전화 막대가 술집에 있으니?