多级类别的利器awesome_nested_set

原创 2013年12月05日 00:32:11

应朋友的要求,从今天起,把用到的gem都写在blog上,即是给大家一个分享,也给自己一个记忆的地方。


原则就是,都是原创,可以少写,但是不帖大量自己没有搞懂的代码或者别人的观点。


今天用到了一个gem包叫做

awesome_nested_set


是一个专门处理多级Model嵌套的。使用二叉树算法,很精妙

用法

gem 'awesome_nested_set'
# gem 'awesome_nested_set', github: 'collectiveidea/awesome_nested_set' #on Rails 4

然后在你的Migration里面,要多级嵌套的地方写上

    create_table :article_categories do |t|
      t.string :name
      t.integer :parent_id
      t.integer :lft
      t.integer :rgt
      t.integer :depth

      t.timestamps
    end
然后在model里

acts_as_nested_set

OK了,一个多级嵌套的模型已经搭建完毕了,简单吧?怎么用呢?

Model(such as article_category
- (Object) ancestors #所有的父节点(包括祖父节点)
- (Boolean) child? #是否是子节点?=有父节点
- (Object) descendants #所有的子节点(包括孙子节点)
- (Boolean) is_ancestor_of?(other) #是否是other的父辈
- (Boolean) is_descendant_of?(other) #是否是other的子辈
- (Boolean) is_or_is_ancestor_of?(other) #是否是other的父辈或自己
- (Boolean) is_or_is_descendant_of?(other) #是否是other的子辈或自己
- (Boolean) leaf? #是否是尾叶子节点?=没有子节点
- (Object) leaves #列出所有的叶子节点
- (Object) left #左边的兄弟编号(二叉树节点号,可不是id哟)
- (Object) left_sibling #左边的兄弟
- (Object) level #深度,0是root
- (Object) move_left #挪到左边兄弟的左边
- (Boolean) move_possible?(target) #能否挪到target的旁边(父子兄弟),如果是target的祖父就不可以
- (Object) move_right #挪到右边兄弟的右边
- (Object) move_to_child_of(node) #挪到node的子节点
- (Object) move_to_child_with_index(node, index) #挪到node的子节点,并且排序为index
- (Object) move_to_left_of(node) #挪到node的左边
- (Object) move_to_ordered_child_of(parent, order_attribute, ascending = true) #挪到parent下,按照order_attribute进行升序(ascending=true)或者降序(ascending=false)排序
- (Object) move_to_right_of(node) #挪到node的右边
- (Object) move_to_root #使自己脱离成为根节点
- (Object) parent #父节点
- (Object) right #右边的兄弟编号(同上)
- (Object) right_sibling #右边的兄弟
- (Object) root #返回所处的树的根节点
- (Boolean) root? #是否是根节点=没有父节点
- (Boolean) same_scope?(other) #这个不是很明白哦,以后搞懂再改
- (Object) self_and_ancestors #自己和所有的父辈
- (Object) self_and_descendants #自己和所有的子孙
- (Object) self_and_siblings #自己和所有的兄弟
- (Object) siblings #所有的兄弟
- (Object) to_text #以文本形式列出树,方便debug
* 1 #<ArticleCategory:0x007fa6815e6e90> (, 1, 8)
** 2 #<ArticleCategory:0x007fa6815e6ad0> (1, 2, 7)
*** 4 #<ArticleCategory:0x007fa6815e67b0> (2, 3, 4)
*** 3 #<ArticleCategory:0x007fa6815e64b8> (2, 5, 6)


通过mysql的log可以看出,每个方法都是一次读取数据库,不需要递归,不需要循环哦。

另外,可以加callbacks

只需要在acts_as_nested_set后面加上一些参数即可

  acts_as_nested_set  :before_add     => :do_before_add_stuff,
                      :after_add      => :do_after_add_stuff,
                      :before_remove  => :do_before_remove_stuff,
                      :after_remove   => :do_after_remove_stuff
好了,今天就到此吧,希望可以给大家帮助




rails awesome_nested_set + ztree 实现树结构加载

接着上一篇文章继续,

C++ Gossip: 巢狀類別(Nested Classes)

類別可以定義在另一個類別之中,這樣的類別稱之為巢狀類別或內部類別,內部類別只被外部包裹的類別所見,當某個Slave類別完全只服務於一個 Master類別時,您可以將之設定為內部類別,如此使用Maste...
  • zoopang
  • zoopang
  • 2014年02月28日 20:34
  • 576

mysql 基于嵌套集合(Nested Set)模型的 path查找 sql函数

mysql 基于嵌套集合(Nested Set)模型的 path查找 sql函数,此两个函数可用于extjs4框架对于左侧treepanel的根据节点的path异步展开的情形。每个函数有一个参数。第...

quaqua-3.9.5.nested

  • 2008年10月19日 08:53
  • 5.32MB
  • 下载

quaqua-3.7.8.nested.zip

  • 2007年10月23日 22:48
  • 4.64MB
  • 下载

awesome java(第三方java框架、类库和软件大全)

前言: 本文转自:http://www.importnew.com/14429.html 而上文又转自:https://github.com/akullpp/awesome-java 文中包含 Jav...

quaqua-7.3.4.nested.zip java美化包

  • 2011年04月11日 21:29
  • 5.82MB
  • 下载

【更新】Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具

Awesome Mac  这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师...

nested-fragments-master

  • 2013年04月29日 03:06
  • 422KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多级类别的利器awesome_nested_set
举报原因:
原因补充:

(最多只允许输入30个字)