2016-11-07 9 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 trernary operartor. –

ответ

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

Это может быть еще более динамично, просто перечисляя имена свойств.


Update: что об использовании затворов в качестве ключей?

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 парам можно абстрагировать, используя что-то вроде 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

Спасибо за ваше предложение. –

 Смежные вопросы

  • Нет связанных вопросов^_^