2016-11-07 5 views
0

다음 코드 경우 어떤 생각, 어떻게 문 여기

User.createCriteria().list(offset: filter.offset, max: filter.max) { 
     if (filter.first-name) eq('firstName', filter.first-name) 
     if (filter.last-name) eq('lastName', filter.last-name) 
     if (filter.email) eq('email', filter.email) 
     if (filter.status) eq('status', filter.status) 
     if (...) ... 
     . 
     . 
     order(filter.sort, 'desc') 
     order('name') 
    } 

여기 if의를 피하기 위해 어떤 방법이 있나요, 피하기 위해?

+1

groovy 3 진수 연산자를 사용할 수 있습니다. –

답변

1

지도는 어떨까요?

User.createCriteria().list(offset: filter.offset, max: filter.max) { 
    [ 
     'firstName' : filter.first-name, 
     'lastName' : filter.last-name, 
     'email'  : filter.email, 
     'status' : filter.status 
    ].findAll { it.value }.each { eq it.key, it.value } 

    order(filter.sort, 'desc') 
    order('name') 
} 

속성 이름을 나열하면 훨씬 더 동적 일 수 있습니다.


업데이트 : 무엇 키로 클로저를 사용하는 방법에 대한?

User.createCriteria().list(offset: filter.offset, max: filter.max) { 
    [ 
     { eq 'firstName', it } : filter.first-name, 
     { eq 'lastName', it } : filter.last-name, 
     { eq 'email', it }  : filter.email, 
     { eq 'status', it } : filter.status, 
     { lt 'dob', it }  : filter.dob 
    ].findAll { it.value }.each { it.key(it.value) } 

    order(filter.sort, 'desc') 
    order('name') 
} 

은 내가 it PARAM이 curry

+0

사실, 제 경우에는 키와 속성 이름이 다릅니다. 그것도 같을 수 있습니다. 또 다른 문제는, 내가 필요한 것만이 아니라는 것이다. 'ilike','ne', 협회의 재산 등 몇 가지가 있습니다. 그러나 어쨌든 좋은 생각입니다. +1 –

+0

@AdeelAnsari가 다른 솔루션으로 업데이트되었습니다. – Will

+0

더 읽을 수 없게되고 있다고 생각하지 않습니까? –

1

그리고 그것은 더 적은 읽을 미만 반복 당신이 당신의 검색 항목의지도를 포함하고 이런 식으로 뭔가를 시도 할 수 있도록 같은 것을 사용하여 추출 할 수 있다고 생각 :

filter.searchList=[first-name:'firstName',last-name:'lastName', 
email:'email', status:'status'] 
User.createCriteria().list(offset: filter.offset, max: filter.max) { 
    filter.searchList?.each { k,v -> 
     !(filter."${k}" ?: eq(v, filter."${k}") 
    } 
    . 
    . 
    order(filter.sort, 'desc') 
    order('name') 
} 
+0

의견을 보내 주셔서 감사합니다. –