2

Grails Taxonomy プラグインを使用してドメイン クラス Foo に追加した分類群内に、ある種の階層を持たせたいと考えています。http://grails.org/plugin/taxonomy

例 (ツリーのようなものを構築するためのアノテーション): {A:{A1:{A1I, A1II}, A2:{A2I}}, B:{B1:{B1I}, B2:{B2II}}}

foo.addToTaxonomy(['A1', 'A2'], "A") foo.addToTaxonomy(['B1', 'B2'], "B")

A1、A2、B1、B2 にも子を持たせるにはどうすればよいですか?

4

1 に答える 1

1

タクソノミーツリーがによって定義されているとしましょう

{A:{A1:{A1I、A1II}、A2:{A2I}}、B:{B1:{B1I}、B2:{B2II}}}

表記A->A1->A1Iは、ツリー内のパスを表します。この場合、パスはルート(A)からリーフ(A1I)までのAツリーにあります。

A-> A1-> A1I分類法にfooを追加する場合は、を使用しますfoo.addTaxonomy(['A', 'A1', 'A1I'])。関数のlistパラメーターは、addTaxonomy実際には分類ツリー内のパスを表します。によって受け入れられる2番目のパラメーターaddTaxonomyはオプションであり、基本的に分類ツリーのスコープを定義します。だから、もし私がやるなら

foo.addTaxonomy(['A', 'A1', 'A1I'], 'scope1')
foo.addTaxonomy(['A', 'A1', 'A1I'], 'scope2')

これにより、fooはscope1とscope2のA->A1->A1Iに配置されます。それらは本質的に2つの異なる木です。おそらくこれは必要ありません。

質問で説明したツリー構造に関連するいくつかの例を次に示します。

A->A1->A1IIに追加

foo.addTaxonomy(['A', 'A1', 'A1II'])

A2->A2Iに追加

foo.addTaxonomy(['A2', 'A2I'])

B->B1->B1Iに追加

foo.addTaxonomy(['B', 'B1', 'B1I'])

B2->B2Iに追加

foo.addTaxonomy(['B2', 'B2I'])

上記の4つの例では、それぞれA、A2、B、およびB2をルートとするツリーを作成します。

分類群の絶対パスを定義したくない場合は、次のようにすることができます。

def taxonPath(taxonName) {
    def currentTaxon = Taxon.findByName(taxonName)
    def path = [currentTaxon.name]

    while(currentTaxon.parent) {
        currentTaxon = currentTaxon.parent
        path = [currentTaxon.name] + path
    }

    return path
}

taxonomyService.createTaxonomyPath(['B', 'B2', 'B2I'])
def book = new Book(name:"hacky solution")
book.addToTaxonomy(taxonPath('B2I'))

これはと同等book.addToTaxonomy(['B', 'B2', 'B2I'])です。import com.grailsrocks.taxonomy.Taxonまた、これを機能させるには、taxonomyServiceをアーティファクトに挿入する必要があります(例:( def taxonomyService))。

このソリューションは少しハッキーで非効率的だと感じますが、機能します。

于 2012-11-23T20:03:47.573 に答える