对于以下代码块,我需要一个更好的解决方案,更好地满足 DRY 原则。有没有办法将每个闭包中的运算符 <,...,>= 作为变量处理?
def query
if (wvOp == ' ')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}"
}
if (wvOp == '<')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin < wiedervorlage
}
if (wvOp == '<=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin <= wiedervorlage
}
if (wvOp == '=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin == wiedervorlage
}
if (wvOp == '>')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin > wiedervorlage
}
if (wvOp == '>=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin >= wiedervorlage
}
query.findAll()
彼得
德国多特蒙德
最佳答案
一种方法是替换您的 where
使用基于标准的查询。沿着这些思路:
// translate incoming comparison operator to equivalent criteria method
def opMap = [ '<': 'lt', '<=': 'lte', '=': 'eq', '>': 'gt', '>=': 'gte' ]
def c = Notiz.createCriteria()
def results = c.list {
and {
ilike(notiztext, params['notiztext'])
ilike(referenz, params['referenz'])
if (wvOp in opMap.keySet()) {
"${opMap[wvOp]}"(anlagetermin, wiedervorlage)
}
}
}
关于grails - 闭包中的变量以避免多个 if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26165041/