多对多自我参考ruby-on-rails

时间:2011-11-11 15:14:29

标签: ruby-on-rails activerecord model

这是我在社区中的第一篇文章,并且有一个问题:代表一个类别树。

第一个解决方案:每个类别都有对其父类别的引用。 这个解决方案的问题是,当我想要一个类别的子树时,我必须多次查询数据库,每个级别(高度)的树一个查询,我想要一些更优化的解决方案。

选择解决方案:类别(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.

我在使用hibernate的java中完成了这个解决方案,但我无法在Rails中做到,如何在迁移和ActiveRecord中指定它?

非常感谢

2 个答案:

答案 0 :(得分:1)

难道你不能让ancestor_id和descendant_id成为类别中的列吗?

这是一个为你做树木的流行宝石https://github.com/collectiveidea/awesome_nested_set

答案 1 :(得分:0)

还有另一种模式:嵌套集,在读取时非常高效,但如果更新大树/插入/重新排序则不行。看看nested_set gem here。自我引用many2many本质上是一个图形,这意味着,如果你不小心,你可能最终得到腐败的树(即有几个父母的节点)。

相关问题