2012-12-05 4 views
2

repeat_purchases_percent는 내 Category 모델의 한 메서드입니다. 모든 상위 카테고리는 데이터베이스의 future_purchases_percent 값을 갖습니다. 하위 카테고리에는 future_purchases_percent가 있거나 없을 수 있습니다. 그럴 경우, 그 값을 사용하고 싶습니다. 그렇지 않으면 상위 값을 사용하고 싶습니다.Ruby on Rails에서 재귀 메서드를 올바르게 구현

재귀 적 방법을 시도했습니다.

if self.future_purchases_percent.nil? 

어떻게 내가 올바르게이 방법을 구현할 수 있습니다 : 그것은 평가 유지 곳

def future_purchases_percent 
    if self.future_purchases_percent.nil? 
    Category.find(self.parent_id).future_purchases_percent 
    else 
    future_purchases_percent 
    end 
end 

이 루프에 걸리면?

답변

5
  1. 메서드가 속성과 이름이 같아서 (자체 자체를 호출하므로) 다른 이름을 선택하면 메서드가 중단됩니다.
  2. 이 조건부는 단순한 a || b 식일뿐입니다.
  3. belongs_to :parent, :foreign_key => 'parent_id', :class_name => :Category을이 모델에 추가해야합니다.

이제 장소에서 모든 것을, 당신은 실제 선언적 코드를 작성할 수 있습니다 :

def safe_future_purchases_percent 
    future_purchases_percent || parent.safe_future_purchases_percent 
end 
기본적으로
+1

거기에 여분의'end'가 있다고 생각하십시오. 그렇지 않으면 bueno를 보입니다. –

+0

감사합니다 @ 앤드류, 그 들여 쓰기 수준은'끝'을 요구하는 것처럼 보였습니다 :-) – tokland

0
def repeat_purchases_percent 
    if self.future_purchases_percent.nil? 
     Category.find(self.parent_id).repeat_purchases_percent 
    else 
     future_purchases_percent 
    end 
    end 

문제는 필드와 같은 일을 당신의 방법이라는 한 후 즉시 호출이다 . 대신에 repeat_purchases_percent이라고 말한 메소드의 이름을 지정하고 future_purchases_percent이 nil 일 때 재귀 적으로 호출해야합니다.

관련 문제