2015-02-23 51 views
0

在我的一個領域類中,我需要存儲從有限集合中選擇的一組符號。在我的情況下,可以選擇一個或多個工作日,例如週一和週二。如何在Grails中存儲一組值?

一般而言,我會解決這個問題有一個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中的這種字段,包括複選框等的自動數據綁定。

回答

1

這確實取決於您的需求。

你的做法是在某些方面優雅,但在有限的人。如果你要保持這種方法,一個簡單的標籤庫來處理渲染複選框和數據綁定將是下一步和一個自定義數據聯編程序來處理控制器中的綁定。

然而,另一種典型的方法是將這些模型作爲域類和具有添加到您的域類選定域類的集合。

另一個不那麼優雅,但簡單的,方法是簡單地拉平這些到您的域名單獨的屬性,讓腳手架處理數據綁定和這樣。

再次,它真的取決於你正在找什麼做的。如果你舒適地將它們建模爲屬性,那麼這是最簡單的解決方案。從那裏移動會收集所選的值。最後,根據您使用標記庫來封裝UI渲染所實現的內容。

+0

我剛剛發現Java有一個高效的類型替代我的自定義位圖:EnumSet。不幸的是,Hibernate/Gorm似乎並沒有以有效的方式堅持這個類,他們只是試圖保存一個序列化的blob。 – Tobia 2015-02-24 10:28:38

+0

您可以隨時爲Hibernate添加自定義類型處理程序來解決這個問題。 – 2015-02-24 10:37:40

+0

我去了7個布爾字段,它只是一週中的7天。但是我會記住EnumSet和將來的自定義類型處理程序。 – Tobia 2015-02-24 10:58:08

0

您可以使用列表enum定義您的選擇。 enum非常容易在Grails中顯示和閱讀。它將生成一個不同的表格映射,即您目前正在實現的內容,但您會獲得簡單性。

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