`
flashcloud
  • 浏览: 185481 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

神奇的Grails:自关联的树状Domain一行代码获取所有子节点

阅读更多

      见证Groovy/Grails的神奇时刻到了,你相信吗?用一行代码就可以获取树状结构中某节点下的所有全部子节点!注意:这个树是无深度限制的。无深度限制这点很重要,如果有限深度的树,那我们也很容易通过层级编码用“Like 001%”方式实现(维护编码也是一个有挑战性活)。我们以一个非常常见的“类别”Domain为例,大类分小类,小类再细分,典型的树形结构,看看Grails是如何以简洁的语法表达的,体验Groovy语法的神奇!

 

 

class Group{
    String name

    static hasMany = [children:Group]
    static belongsTo = [parent: Group]

    static transients = ['allChildren']

    def getAllChildren(){
        children ? children + children*.allChildren.flatten() : []
    }
}

 

1.两行代码表述一个树状结构,同时Grails自动为你生成数据库表

 

static hasMany = [children:Group]
static belongsTo = [parent: Group]

 

2.一行代码获取任意深度的全部子节点:

 

children ? children + children*.allChildren.flatten() : []

   递归调用这个是必须的*.allChildren.flatten()。

   短短一行代码,展现了五个Grovvy的知识点:

   (1)可以省略 return 。这对不愿多打一个字母的懒人来说也是不小的福利;

   (2)[]。这可不是数组,在Groovy中最常见的列表List;

   (3)操作符重载:List 的 “ + ” 运算符。assert [1,2,3,4] == [1,2] + [3,4];

   (4)*展开元素操作符。自动对List中的每个元素进行枚举操作,不用为此写一个for循环了;

   (5)flatten() 。这是实现此算法的关键,它将所有递归得到的嵌套子节点List使用flatten操作,

得到一个一维的Group列表。List的这个flatten()方法能作到:

       assert [1,2,3,4,5] == [1,[2,3],[[4]],[],5].flatten()

 

至此,一个完全可用的树状结构领域模型完成了,你可以调用Grails的GORM语法糖addToChildren,removeFromChildren 任意的添加/删除子节点,save,delete这些神奇的GORM方法自不用说,更不用写Hibernate的XML。

0
2
分享到:
评论
6 楼 java-007 2014-05-04  
alanland 写道
一楼还有个眉头没脑的提问

你的理解能力真TM差,傻逼。
5 楼 xpjava 2014-05-02  
请问大侠,如何显示?这个树形结构?
4 楼 alanland 2013-12-25  
一楼还有个眉头没脑的提问
3 楼 alanland 2013-12-25  
涨知识了,还学到一个 flatten
2 楼 flashcloud 2011-09-08  
没太明白你说的,生成的脚手架直接中文?我没清楚你说的需求点在哪
1 楼 java-007 2011-09-07  
赞。哥们改过grails的源码吗?
有没有想过直接定义一下属性,让他生成的代码直接都是中文的。

相关推荐

Global site tag (gtag.js) - Google Analytics