如何使用grails taxonomy插件向taxons添加层次结构?

时间:2012-11-14 23:01:25

标签: grails plugins taxonomy

我想在我的类别中使用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的孩子有什么方式?

1 个答案:

答案 0 :(得分:1)

假设您的分类树由

定义
  

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

并且符号A-> A1-> A1I描述树中的路径。在这种情况下,路径在从其根(A)到叶(A1I)的A树中。

如果您想将foo添加到A-> A1-> A1I分类中,您可以使用foo.addTaxonomy(['A', 'A1', 'A1I'])。函数addTaxonomy的list参数实际上表示分类树中的路径。 addTaxonomy接受的第二个参数是可选的,实质上定义了分类树的范围。所以,如果我要做的话

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

这会将foo放在scope1和scope2中的A-> A1-> A1I中。它们基本上是两棵不同的树。你可能不需要这个。

以下是与您在问题中描述的树结构相关的一些示例:

添加到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为根的树。

如果您不想定义Taxon的绝对路径,可以执行以下操作:

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)为此工作。

解决方案感觉有点hacky和低效,但它确实有效。