2012-12-05 360 views
2

repeat_purchases_percent是我的分類模型中的一種方法。保證所有無父類別在數據庫中具有Future_purchases_percent的值。子類可能有也可能沒有future_purchases_percent。如果他們這樣做,我想使用該值。如果不是,我想使用父母的價值等等。在rails上正確實現遞歸方法

我試過遞歸方法。

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

此卡在一個循環,它使評價:

if self.future_purchases_percent.nil? 

我怎樣才能正確地執行這種方法嗎?

回答

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

認爲你在那裏有一個額外的'結束'。否則看起來是bueno。 –

+0

謝謝@Andrew,那個縮進級別似乎是要求一個'end' :-) – 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爲零時纔會遞歸到該方法中。