2016-11-07 55 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 S'

+1

你可以使用groovy三元操作符。 –

回答

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

其實,在我的情況下,鍵和屬性名稱是不同的。不過,這可以做成相同的。另一個問題是,這不僅僅是我需要的「eq」。有幾個,比如'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

感謝您的建議。 –