タクソノミーツリーがによって定義されているとしましょう
{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
))。
このソリューションは少しハッキーで非効率的だと感じますが、機能します。