Rails:单个项目的多个树

Jos*_*ura 2 tree ruby-on-rails hierarchy nested-sets

我想对多个树中的对象进行分类以反映其特征并构建导航.

所以,考虑到以下树木:

Category1
-Category-1-1
-Category-1-2

Category2
-Category-2-1
-Category-2-2
--Category-2-2-1
Run Code Online (Sandbox Code Playgroud)

对象可以例如属于类别1-2和类别-2-2-1.

目标是能够从数据库中获取所有对象

  • 属于某个类别
  • 属于某一类别或其后代的

一个更实际的例子:

类别可能具有"工具>园艺工具>切割器"的层次结构.

第二类:'硬物>金属物>小金属物'

对象'Pruners'将被归类为属于'Cutters'以及'Small metal objects'.

我希望能够

  • 检索所有'园艺工具' - >'修剪'
  • 检索"园艺工具" - >"刀具"的所有类别子项
  • 检索所有'硬物' - >'修剪'
  • 检索所有'硬物',也是'Cutters' - >'Pruners'
  • 检索所有'软件对象'也是'Cutters' - > []任何指针?我简要地看了一下closure_tree,awesome_nested_sets等,但我不确定它们是不是很匹配.

And*_*eyy 5

请注意,这里的代码都是伪代码.

我会使用祖先 gem并使用三个模型类对数据建模.这样,您的数据就会被标准化,并且它是构建的良好基础.

Category - ancestry tree
  has_may Memberships
  has_may Products through Memberships

Membership
  belongs_to Category
  belongs_to Products

Products
  has_may Memberships
  has_may Categories through Memberships
Run Code Online (Sandbox Code Playgroud)

从那里你需要弄清楚如何有效地执行equerries.我这样做的方法是了解如何使用SQL,然后弄清楚如何使用activercord的DSL表达查询.

一些资源:

查询示例:

查找类别.

Category.find(category_id)

查找类别并将其包含在指定类别中.

Category.find(category_id).join(:memberships => :products)

查找类别的子树ind包括产品

Category.subtree_of(category_id).join(:memberships => :products)

查找产品所属的所有类别.

Product.find(product_id).categories