성배 : 자기 참조 된 일대적인 관계에서 모든 어린이를 찾으십시오.
문제
성배에서
일대일 관계에서 모든 아이들을 어떻게 찾을 수 있을까요?
class Employee {
static hasMany = [ subordinates: Employee ]
static belongsTo = [ manager: Employee ]
}
단일 관리자를 사용하면 어떻게 모든 부하 직원의 부하 직원을 어떻게 얻을 수 있습니까?
해결책
도메인을 수정하지 않으려면 재귀 클로저가 작동합니다. 그렇지 않으면 과도 속성을 추가 할 수 있습니다 Employee
도메인 클래스와 같은 allSubordinates
이 예에서 :
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())
}
}
다른 팁
//Make a recursive closure
def printAll
printAll = { emp ->
subordinates.each {
println it
printAll emp
}
}
제휴하지 않습니다 StackOverflow