2009-08-03 6 views
2

En Grails,GRAILS: Trouver tous les enfants un-à-plusieurs auto-référencées

Comment peut-on trouver tous les enfants un-à-plusieurs, par exemple,

class Employee { 
    static hasMany = [ subordinates: Employee ] 
    static belongsTo = [ manager: Employee ] 
} 

En utilisant un seul gestionnaire, comment obtiendriez-vous les subordonnés de tous les subordonnés (comme traverser un graphe d'objets)?

Répondre

12

La fermeture récursive fonctionne si vous ne souhaitez pas modifier le domaine. Sinon, vous pouvez ajouter une propriété transitoire à la classe de domaine Employee comme allSubordinates dans cet exemple:

class Employee { 
    String name 
    static hasMany = [ subordinates: Employee ] 
    static belongsTo = [ manager: Employee ] 
    static transients = ['allSubordinates'] 
    def getAllSubordinates() { 
     return subordinates ? subordinates*.allSubordinates.flatten() + subordinates : [] 
    } 
} 

Voici un test d'intégration pour le voir en action:

import grails.test.* 

class EmployeeTests extends GrailsUnitTestCase { 
    Employee ceo 
    Employee middleManager1, middleManager2 
    Employee e1, e2, e3, e4, e5, e6 

    protected void setUp() { 
     super.setUp() 
     ceo = new Employee(name:"CEO") 
      middleManager1 = new Employee(name:"Middle Manager 1") 
       e1 = new Employee(name:"e1") 
       e2 = new Employee(name:"e2") 
       e3 = new Employee(name:"e3") 
      middleManager2 = new Employee(name:"Middle Manager 2") 
       e4 = new Employee(name:"e4") 
       e5 = new Employee(name:"e5") 
       e6 = new Employee(name:"e6") 

     ceo.subordinates = [middleManager1, middleManager2] 
     middleManager1.subordinates = [e1,e2,e3] 
     middleManager2.subordinates = [e4,e5,e6] 
     assert ceo.save() 
    } 

    void testAllSubordinates() { 
     def topLevelManager = Employee.get(ceo.id) 
     assertNotNull(topLevelManager); 
     assertEquals(8, topLevelManager.allSubordinates?.size()) 
    } 
} 
3
//Make a recursive closure 
def printAll 

printAll = { emp -> 
    subordinates.each { 
         println it 
         printAll emp 
         } 
} 
Questions connexes