如何使用grails分类插件向分类单元添加层次结构?

如何使用grails分类插件向分类单元添加层次结构?,grails,plugins,taxonomy,Grails,Plugins,Taxonomy,我希望在使用Grails分类插件添加到域类Foo的分类单元中有某种层次结构 示例(用于构建类似于树的内容的注释): {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也有子对象的方式是什么?假设您的分类树由 {A:{A1:{A1I,A1II},A2:{A2I},B:{B1:{B1I}

我希望在使用Grails分类插件添加到域类Foo的分类单元中有某种层次结构

示例(用于构建类似于树的内容的注释): {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也有子对象的方式是什么?

假设您的分类树由

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

符号A->A1->A1I描述了树中的路径。在本例中,路径位于树的根(A)到叶(A1I)之间

如果要将foo添加到A->A1->A1I分类法中,可以使用
foo.addTaxonomy(['A','A1','A1I'])
。函数
addTaxonomy
的列表参数实际上表示分类树中的路径。
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的树

如果不想定义分类单元的绝对路径,可以执行以下操作:

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')
。您还需要
导入com.grailsrocks.taxonomy.Taxon
并将taxonomyService注入到您的工件中,例如(
def taxonomyService
)才能工作


这个解决方案感觉有点粗糙和低效,但它确实有效。

谢谢!我在问了这个问题后就想到了这个。它几乎解决了这个问题。但是它有一点开销。如果存在A、B、A1、A2、B1的某些类别行为。。。我只需要将B2I添加到foo中,它就会隐式地将B2和B作为父类别。我会再考虑的,稍后再读!听起来您更喜欢提前创建树,然后简单地将域对象添加到树中的一个节点。不幸的是,分类法插件似乎不支持这一点。我尝试了
taxonomyService.createTaxonomyPath(['B','B2','B2I'])
,它创建了树{B:{B2:{B2I}}。然后我做了
book.addToTaxonomy(['B2I'])。这成功地将
book`添加到了
'B2I'
分类中,但是
book.findAllByTaxonomyFamily(['B'])
返回时没有结果,这意味着
book
没有添加到
'B'
'B2'
。您必须完全限定路径:
book.addToTaxonomy(['B','B2','B2I'])
查看您的解决方案给我带来了一些新想法:foo.addTaxonomy(['A'],'level0')foo.addTaxonomy(['A1'],'level1')foo.addTaxonomy(['A1I'],'level2')foo.addTaxonomy(['B'],'level0')foo.addTaxonomy(['B1'],'level1'),'B1I'],'level2'))所以我有机会按级别进行查询事实上,我提出了一个相当粗糙的解决方案。我会把它添加到我的原始回复中,因为这样会更容易。嗯,如果你认为解决方案能实现你想要的,那就好了。然而,您实际上只是创建了几个不同的分类单元列表:level0:['A','B'],level1:['A1','B1'],level2:['A1I','B1I']。至少这是我的理解。Taxon插件似乎并不那么直观。