商品分类之"无限级分类"

原理

在数据库中通过一张表,囊括所有的分类

在关系型数据库中建立树形结构(Storing tree structure in RDBMS)

比较常见的有下面三种形式

Parent-child

一句话:在一张表内id与parent_id搭配使用,存储所有类别

Materialized Path

一句话:每一个分类都记录其从根类分出来的路径

举例:圣经 马太福音 第七章 第七节

Nested Sets

一句话:通过给每个节点增加left与right两个栏位,来限定范围

两张图集合着看,相信很容易就明白了

学习如何实现无线级分类

这些原理理解了最好,不是很理解,也并不会很影响你的使用
下面列出几个可以帮助你实现无限级分类的gem
acts_as_tree 比较早的Rails官方在维护,后来也交给第三方维护了,使用的是parent-child原理
ancestry 比较流行的一个gem,用的是Materialized Path原理
awesome_nested_set 用的是Nested Sets原理
closure_tree 原理是在parent-child基础上进行拓展

至于如何使用,我的建议是先按顺序看完下面三个视频
#162 Tree Based Navigation - RailsCasts
#262 Trees with Ancestry - RailsCasts
#162 Tree-Based Navigation (revised) - RailsCasts

这三个视频有涉及到acts_as_treeancestry的使用方法
视频比较老,但使用方法并没有过时,这几个gem,基本就是初始设置有点不同,以后的日常使用,思路基本一样

Gem取舍问题

我也看了很多博文,结果如下

  • 分类成绩两个以内,可以用这个acts_as_tree (特点:写入快,读取慢)
  • 适用各类场景,鉴于很多人推崇他,所以,我也建议大家使用他,相关的视频也不少ancestry (特点:读取快,写入慢)
  • 如果ancestry的读取速度你不满意,那请你用这个,awesome_nested_set (特点:读取快,写入慢)
  • 再耍过ancestry后,应该就可以来玩这个了closure_tree 了解不多,不过评价很高

使用举例

  • category.parent拿到当前分类的父分类
  • category.root达到当前分类的根分类
  • category.children拿到当前分类的所有子分类
  • category.ancestors拿到当前分裂的所有子分类,子分类的子分类.......
  • actegory.depth拿到当前分类的所在层级 > 还有很多好用的方法,只是gem之间的个别方法名不一样而已

参考博文



往期分享

吉翔

Github仓库备份
中文字体自定义
魔改大赛这样开始比较快

董明娟

Panel+Grid作出清爽购物车