2009-08-03 25 views
2

のGrailsでは、Grailsの:自己参照1対多の関係

1は、1対多の関係などのすべての子供たちを見つけるだろうどのように

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

内のすべての子供たちを探します1つのマネージャーを使って、どのようにすべての部下(オブジェクトグラフをたどるような)の部下を得るでしょうか?

答えて

12

再帰的クロージャは、ドメインを変更したくない場合に機能します。そうしないと、この例ではallSubordinatesようEmployeeドメインクラスに過渡プロパティを追加することができます。

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

は、アクションでそれを参照するには、統合テストです:

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 
         } 
}