如何在 Grails 中存储一组值?

How to store a set of values in Grails?

在我的一个域中 类 我需要存储一组从有限集中选择的符号。在我的例子中,它是一个或多个工作日的选择,比如星期一加星期二。

一般来说,我会用位集来解决这个问题(位 0 = 星期一,位 1 = 星期二...)

所以我的第一个版本是这样的:

class SomeDomainClass {
    // available elements
    static final MON = 1, TUE = 2, WED = 4, THU = 8, FRI = 16, SAT = 32, SUN = 64

    // the persistent field and its default value
    int businessDays = MON | TUE | WED | THU | FRI

    // constraint: not null, not empty and not outside bit set
    static constraints = {
        businessDays nullable: false, min: 1, max: 127
    }

    // list getter, returns a list such as [MON, TUE]
    def getBusinessDaysList() {
        return [MON, TUE, WED, THU, FRI, SAT, SUN].findAll { businessDays & it }
    }

    // list setter, accepts a list such as [MON, TUE]
    void setBusinessDaysList(list) {
        businessDays = list.inject { a,b -> a|b }
    }
}   

但是一些事情告诉我在 Grails/Hibernate 中有更好的方法来处理这种字段,包括复选框等的自动数据绑定。

这真的取决于您的需要。

您的方法在某些方面很优雅,但在其他方面却很有限。如果您要继续使用这种方法,下一步将是一个简单的标记库来处理呈现复选框和数据绑定,以及一个自定义数据绑定器来处理控制器中的绑定。

但是,另一种典型方法是将这些建模为域 class,然后将所选域 class 的集合添加到您的域 class。

另一种不太优雅但简单的方法是将它们简单地扁平化为域中的各个属性,并让脚手架处理数据绑定等。

同样,这实际上取决于您想要做什么。如果您愿意将它们建模为属性,那么这是最简单的解决方案。从那里移动将是所选值的集合。最后,与您使用标记库封装 UI 渲染实现的内容类似。

您可以使用 List of enum 来定义您的选择。 enum 在 Grails 中显示和阅读非常简单。它将生成一个不同的 table 映射,与您当前实现的目标不同,但您会变得简单。

<g:select class="form-control" name="test" from="${AnEnum.values()}" keys="${AnEnum.values()}" valueMessagePrefix="anEnum.value" value="${aModel.enumList}"/>