2011-03-04 76 views
1

我認爲這是一個普通的ruby問題,但在我的案例中涉及的對象是ActiveRecord模型。Ruby/Rails:確定對象的嵌套深度

如果我有一個模型可以嵌套在另一個模型中,我該如何確定模型嵌套的深度?

IE:

Model Root (Level 0) 
- Model Level 1 
- - Model Level 2 
- - Model Level 2 
- - Model Level 2 
- - - Model Level 3 
- - - Model Level 3 
- Model Level 1 
- Model Level 1 

在假設foo是嵌套三個層次深的模型(如上所示)。如果我打電話foo.parent.parent.parent,我會得到根模型。

我該如何定義一個方法,如:foo.depth,它會返回foo和它的根之間有多少級別?

謝謝!

回答

4

像這樣的東西應該做的伎倆:

def depth 
    parent.nil? ? 0 : 1+parent.depth 
end 
+0

哇!簡單,優雅,非常紅寶石。這工作完美,謝謝! – Andrew 2011-03-04 16:19:30

0

您需要創建recursive method。例如:

class Sample 

    attr_accessor :parent 

    def depth 

    # Base case. 
    return 0 if parent.nil? 

    # Recursive case. 
    return parent.depth + 1 

    end 

end 

這是假設您的父類將始終響應'深度'。如果不是,您需要在respond_to?上進行一些檢查。

+0

凱文,感謝您的回答,這是一個有益的闡述。這與Ogz巫師的答案相同,但是我選擇了他,因爲我喜歡三元運算符,而且你有超過4000的聲譽,所以感謝他! – Andrew 2011-03-04 16:23:31

+0

也感謝您對'respond_to?'的建議。在我的情況下,所有的物體都會對深度做出反應,但這是一個非常好的選擇! – Andrew 2011-03-04 16:24:14