结合params数组的标准

时间:2013-11-08 03:24:17

标签: grails gorm

此示例来自grails docs:

def emeaCriteria = {
    eq "region", "EMEA"
}
def results = Airport.withCriteria {
    emeaCriteria.delegate = delegate
    emeaCriteria()
    flights {
        like "number", "BA%"
    }
}

我的网页传回一个种族复选框组,返回行ID。那么服务器得到的是:

ethnicity:[1, 4]

或者如果用户只挑选一个种族:

   ethnicity:4

        def criteria = { params ->
//handle case where only one ethnicity is returned as just a string, not a list of strings
            def list = params.ethnicty instanceof String ? [params.ethnicty] : params.ethnicity
            if (list) {
            inList('ethnicity', list)
            }
        }

我收到错误:java.lang.String无法强制转换为java.lang.Enum。

如果我没有列表,我想我可以搞清楚。 params正在发回字符串值,需要将它们转换为枚举类。但是在闭包中,你如何将每个条目转换为枚举列表?

1 个答案:

答案 0 :(得分:1)

我通过多个网站帖子的组合以及上面的dmahapatro的帮助来解决这个问题。

def genderCriteria = {
    if (params.gender) {
        inList('gender', params.list('gender').collect { Gender.valueOf(it)} )
    }
}

如果网页传回一个或多个枚举(单个字符串或字符串列表)并且您希望条件检查传回的列表中的值,则必须提供枚举类型列表(不是字符串或整数)

这是我的枚举类供参考:

public enum Gender {
    M('Male'),
    F('Female'),
    U('Unknown')

    final String value

    Gender(String value) {
        this.value = value
    }
    public String toString() {
        value
    }
    public String getKey() {
        name()
    }
    public String getValue() {
        value
    }

}

我的标准构建者:

        def c = MyDomain.createCriteria()
        results = c.list { 
            genderCriteria.delegate = delegate
            genderCriteria(params)

        }

即使没有为性别字段传回任何值,它仍然有效(因为genderCriteria中的if语句。

它可能不是最好或最干净的解决方案,但确实有效。