比if / else更好地解决过滤器的方法

时间:2013-08-24 02:50:03

标签: grails groovy gorm

在我的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]

是否有一种模式可以在它失控之前用来解决这个问题

1 个答案:

答案 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。