在我的一个域类中,我需要存储一组从有限集中选择的符号。在我的情况下,它可以选择一个或多个工作日,比如星期一加星期二。
一般来说,我会用bitset来解决这个问题(第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中处理这种字段的更好方法,包括复选框等的自动数据绑定。
答案 0 :(得分:1)
这实际上取决于您的需求。
您的方法在某些方面很优雅,但在其他方面则有限。如果你要坚持这种方法,那么处理渲染复选框和数据绑定的简单标记库将是下一步,并且是一个自定义数据绑定器,用于处理控制器中的绑定。
但是,另一种典型方法是将这些模型建模为域类,并将所选域类的集合添加到域类中。
另一种不太优雅但简单的方法是简单地将这些内容压缩到域中的各个属性中,让脚手架处理数据绑定等。
同样,这实际上取决于您的目标。如果您将它们建模为属性,那么这是最简单的解决方案。从那里移动将是所选值的集合。最后,通过使用标记库来封装UI渲染,实现了一些内容。
答案 1 :(得分:0)
您可以使用枚举的列表来定义您的选择。 enum 在Grails中显示和阅读非常简单。它将生成一个不同的表映射,表示您当前正在实现的目标,但是您会变得简单。
<g:select class="form-control" name="test" from="${AnEnum.values()}" keys="${AnEnum.values()}" valueMessagePrefix="anEnum.value" value="${aModel.enumList}"/>