不思議なGrails:関連するツリーDomainの1行のコードからすべてのサブノードを取得
Groovy/Grailsを目撃する不思議な時が来たと信じていますか?ツリー構造のノードの下にあるすべてのサブノードを1行のコードで取得できます!注意:この木は深さ制限がありません.深さ制限がないことが重要であり,限られた深さのツリーであれば,階層符号化によって「Like 001%」方式で容易に実現できる(符号化の維持も挑戦的な仕事である).私たちは1つのとてもよくある“カテゴリ”Domainを例にして、大きいクラスは小さいクラスに分けて、小さいクラスは更に細分化して、典型的な木の形の構造、Grailsがどのように簡潔な文法で表現したことを見て、Groovy文法の不思議さを体験します!
1.2行のコードはツリー構造を表し、Grailsは自動的にデータベーステーブルを生成します.
2.1行のコードは、任意の深さのすべてのサブノードを取得します.
これを再帰的に呼び出す必要があります*.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を書く必要はありません.
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を書く必要はありません.