2011-11-11 94 views
1

這是我在社區中的第一篇文章,有一個問題:代表一個分類樹。多對多自引用ruby-on-rails

第一個解決方案:每個類別都有一個對其父類別的引用。 這個解決方案的問題是,當我想要一個類樹的子樹時,我不得不多次查詢數據庫,每個樹的每個級別(高度)都有一個查詢,我希望某些解決方案更加優化。

選擇的解決方案:類別(ID,名稱,描述)和CategoryxCategory(ancestor_id, descendant_id) 所以建立一個子樹我只需要一個這樣的查詢,

select * from category a, categoryxcategory b.where b.ancestor_id = 1 and 
b.descendant_id = a.id , gets all sub-categories of the category with id = 1. 

我做這個在java中使用hibernate解決方案,但我不能在Rails中完成,我怎麼在遷移和ActiveRecord中指定這個?

非常感謝

回答

1

你就不能有ancestor_id和descendant_id在類別列?

這裏有一個流行的寶石,做樹爲您https://github.com/collectiveidea/awesome_nested_set

+0

其實我不能,因爲我想用db中的單個查詢構建一個子樹,在做這個解決方案時,我將不得不多次查詢數據庫以獲得高度> 2的子樹。 '試試這個寶石 –

+0

只是爲了完成這個話題,真正幫助我的是[Ancestry](http://rubygems.org/gems/ancestry),它正是我想要的。感謝您的幫助 –

0

還有另一種模式:嵌套集合,這是看了不少高性能的,但如果你更新大樹/插入/重新排序。看看nested_set gem here。一個自引用many2many本質上是一個圖,這意味着,如果你不小心,你可能會得到腐敗的樹(即有多個父母的節點)。