在我的list方法中,我将从客户端传递几个过滤器。目前我有一个很长的if / else块列表,它们会根据进入的参数执行。
我想知道是否有更好的方法来解决这个问题?
def list () {
println params
def list = []
if (params["Column1"] != null) {
list = Mymodel.createCriteria().listDistinct {
eq("somecolumn", params["Column1"]);
}
}
else if (params["Column2"] != null) {
list = Mymodel.createCriteria().list {
eq("someothercolumn", params["Column2"]);
}
}
else if (params["filter"] == "failed") {
list = MyModel.createCriteria().list {
eq("status", false);
}
}
return list as JSON
}
以下是我收到的几个请求的参数:
[Column1:somevalue, action:[GET:list], controller:somecontroller]
[Somecolumn:someothervalue, action:[GET:list], controller:somecontroller]
是否有一种模式可以在它失控之前用来解决这个问题
答案 0 :(得分:3)
我认为不涉及任何模式,但您可以使用Elvis运算符将代码向下钻取到几行,并删除创建条件的冗余:
def list() {
def list = []
def someColumnValue = params.Column1 ?: params.Column2 ?: null
def statusValue = params.filter == 'failed'
list = Mymodel.withCriteria{ //can also use createCriteria
if(someColumnValue) {
eq("somecolumn", someColumnValue)
} else if(statusValue) {
eq("status", !statusValue)
}
}
list as JSON
}
如果参数数量增加,那么您可以使用类似
的内容def someColumnValue = params.Column1 ?:
params.Column2 ?:
params.Column3 ?:
params.Column4 ?:
null
如果只涉及单个参数,那么您可以有效地使用switch case块而不是if else。