2012-11-14 2 views
2

Grails Taxonomy 플러그인을 사용하여 내 도메인 클래스 Foo에 추가 한 내 분류군 내부에 일종의 계층 구조를 만들고 싶습니다. http://grails.org/plugin/taxonomygrails taxonomy plugin을 사용하여 taxon에 계층 구조를 추가하는 방법은 무엇입니까?

예 (나무처럼 뭔가를 구축 주석) : {A : {A1 : {a1 애드 센스, A1II}, A2 : {A2I}}, B : {B1 : {B1I}, B2 : {B2II} }} 방법이 너무 A1, A2, B1 및 B2에 아이들이 무엇

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

? {A1 : {a1 애드 센스, A1II}, A2 :

답변

1

의이 분류 나무가

{A에 의해 정의되어 있다고 가정 해 봅시다 {A2I}}, B : {B1 : {B1I}, B2 : {B2II }}}

및 표기 A-> A1-> A1I는 트리의 경로를 설명합니다. 이 경우 경로는 루트 (A)에서 리프 (A1I)까지 A 트리에 있습니다.

A-> A1-> A1I 분류에 foo를 추가하려면 foo.addTaxonomy(['A', 'A1', 'A1I'])을 사용하십시오. addTaxonomy 함수의 list 매개 변수는 실제로 분류 트리의 경로를 나타냅니다. addTaxonomy에 의해 허용되는 두 번째 매개 변수는 선택 사항이며 본질적으로 분류 트리의 범위를 정의합니다. 그래서, 내가해야한다면

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

이렇게하면 scope1과 scope2의 A-> A1-> A1I에 foo가 위치하게됩니다. 그들은 본질적으로 두 개의 다른 나무입니다. 당신은 아마 이것을 필요로하지 않습니다. >

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

추가 A2-하기에 A-> A1-> A1II

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

추가 : 여기

는 귀하의 질문에 설명되어있는 트리 구조와 관련된 몇 가지 예입니다

B-> B1-> B1I

foo.addTaxonomy(['B', 'B1', 'B1I']) 
B2-하기 1,363,210

> 추가 B2I

4 실시 예는 상기 각각 A, A2, B, B2 및 루트 트리를 생성
foo.addTaxonomy(['B2', 'B2I']) 

. 당신이 분류군의 절대 경로를 정의하지 않으려면

, 당신은 같은 것을 할 수 있습니다 :이 book.addToTaxonomy(['B', 'B2', 'B2I'])에 해당

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')) 

. import com.grailsrocks.taxonomy.Taxon으로 설정하고 taxonomyService를 이슈에 삽입해야합니다 (예 : (def taxonomyService)이 작동합니다.

이 솔루션은 약간의 해킹과 비효율을 느끼지만 작동합니다.

+0

감사합니다. 나는이 질문을 한 후에 이것에 대해 생각했다. 그것은 거의 그것을 해결합니다. 그러나 약간의 오버 헤드가 있습니다. A, B, A1, A2, B1의 몇 가지 카테고리 동작이있는 경우 ... 나는 foo에 B2I 만 추가해야하고 암시 적으로 B2 및 B가 상위 카테고리로 포함됩니다. 나는 그것에 대해 다시 생각할 것이고, 나중에 읽어 줄 것이다! – skurt

+1

트리를 미리 작성한 다음 트리의 한 노드에 도메인 오브젝트를 추가하는 것이 좋습니다. 불행히도, Taxonomy 플러그인이이를 지원하지 않는 것처럼 보입니다. 나는 트리 {B : {B2 : {B2I}}}를 생성하는'taxonomyService.createTaxonomyPath ([ 'B', 'B2', 'B2I'])'를 시도했다. 그런 다음'book.addToTaxonomy ([ 'B2I'])를 수행했습니다. 이는 B2I 분류에 성공적으로 추가되었지만 Book.findAllByTaxonomyFamily ([ 'B'])는 아무런 결과도 반환하지 않았기 때문에 'B'또는 ' B2''. 'book.addToTaxonomy ([ 'B', 'B2', 'B2I'])' –

+0

당신의 솔루션을 보면 새로운 아이디어를 얻었습니다 : foo.addTaxonomy ([ 'A'] , 'level0') foo.addTaxonomy ([ 'A1'], 'level1') foo.addTaxonomy ([ 'A1I'], 'level2') foo.addTaxonomy ([ 'B'], 'level0') foo.addTaxonomy는 ([ 'B1', '레벨 1')는 그래서 나는 사실 수준 – skurt

관련 문제