不思議なGrails:関連するツリーDomainの1行のコードからすべてのサブノードを取得


Groovy/Grailsを目撃する不思議な時が来たと信じていますか?ツリー構造のノードの下にあるすべてのサブノードを1行のコードで取得できます!注意:この木は深さ制限がありません.深さ制限がないことが重要であり,限られた深さのツリーであれば,階層符号化によって「Like 001%」方式で容易に実現できる(符号化の維持も挑戦的な仕事である).私たちは1つのとてもよくある“カテゴリ”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.2行のコードはツリー構造を表し、Grailsは自動的にデータベーステーブルを生成します.
 
static hasMany = [children:Group]
static belongsTo = [parent: Group]

 
2.1行のコードは、任意の深さのすべてのサブノードを取得します.
 
children ? children + children*.allChildren.flatten() : []

これを再帰的に呼び出す必要があります*.allChildren.flatten().
わずか1行のコードで、Grovvyの5つの知識点が表示されます.
(1)returnは省略できる.これはアルファベットを1つ多くしたくない怠け者にとっても小さな福祉ではありません.
   (2)[].これは配列ではなく、Groovyで最も一般的なリストリストです.
(3)オペレータリロード:Listの「+」演算子.assert [1,2,3,4] == [1,2] + [3,4];
(4)*要素オペレータを展開します.リスト内の各要素を自動的に列挙し、forループを書く必要はありません.
   (5)flatten() .これはこのアルゴリズムを実現する鍵であり,再帰的に得られたネストされたすべてのサブノードListをflatten操作で使用し,
1次元のGroupリストが得られます.Listのこのflatten()メソッドは、
       assert [1,2,3,4,5] == [1,[2,3],[[4]],[],5].flatten()
 
これで、完全に使用可能なツリー構造領域モデルが完成し、GrailsのGORM構文糖addToChildren、removeFromChildrenの任意のサブノードの追加/削除、save、deleteなどの不思議なGORMメソッドを呼び出すことができます.HibernateのXMLを書く必要はありません.