2012-04-12 57 views
2

這是我一直在努力的一段時間。事情是:我有很多(20左右)靜態值的數組。我說靜態,因爲這就是我實際存儲它們的方式,因爲它們是某些域內的靜態數組。例如,如果我知道網站的列表,我做的:Grails - 在哪裏存儲與域名相關的房產

class Website { 
    ... 
    static websites = ["web1", "web2" ...] 
} 

但我這樣做只是在發展,因爲如果需要,我可以很容易地改變陣列,但我現在要做的時候應用程序已準備好部署?在我的項目中,很可能在某些時候,這些數值的陣列發生變化。我一直在研究這個問題,可以將應用程序屬性存儲在外部.properties文件中,但是不可能存儲數組,甚至是徒勞的,因爲如果某個數組獲得附加值,應用程序無法識別它直到在需要時添加新財產的名稱。
另一種方法是將這些信息存儲在數據庫中,但出於某種原因,添加20個或更多表將只有兩行,即一個id和一個名稱是很浪費的。
據我所知,最後一個選項是XML,但我對這些並不是很有經驗。看起來groovy有一種創建和讀取XML文件的方法相對容易,但我不知道修改應用程序中預定義佈局的XML有多困難。

不用說,將它們存儲在config.groovy中不是一個選項,因爲任何更改都需要重新編譯。

我還沒有遇到一些「標準」(也許是最佳做法?)處理這些問題的方法。

所以問題是:在哪裏存儲這些數組?

回答

1
  1. 使用Enum爲一組固定的屬性。如果您在代碼中的某些地方依賴某些具體的值,請執行此操作。
  2. 如果您不依賴代碼中的屬性(顯然沒有),請使用String-類型。在這種情況下,如果您需要提供選擇框,只需在數據庫中對該屬性執行distinct查詢。
  3. 默認值:對每個動態屬性集使用一個域類。另一張桌子是好的。
+0

當然#1和#3 – David 2012-04-13 01:23:29

+0

所以會有很多一對一的關係。我需要根據這些屬性進行篩選和排序。例如,Book.nameOfCategory(在單獨的表中的屬性)比Book.nameOfCategory(屬性直接存儲在表中)排序真的更快。 – GalmWing 2012-04-15 17:09:48

+0

如果多個實例具有相同的類別,這不是一對一的。如果是表現令你感到恐慌,請查看http://grails.org/doc/latest/guide/GORM.html#gormComposition。 – Chris 2012-04-15 17:29:14

1

對於像數組一樣簡單的事情,你應該使用groovy自己的屬性文件類型。它們也允許你將屬性定義爲適當的groovy變量(而不僅僅是字符串),並且顯然通過使用ConfigSlurper以簡單的方式進行加載。有關如何使用這種文件的一個例子,你可以看看下面的ConfigSlurper

爲了定義屬性:

my.property.array=[1,2,3,4] 

對於加載屬性文件:

def config = new ConfigSlurper().parse(new File('myconfig.groovy').toURL()) 
assert [1,2,3,4] == config.my.property.array 

提示:當您想要以適合任何環境的方式訪問屬性文件時。爲了使道路環境獨立使用以下路徑爲根路徑:

import org.codehaus.groovy.grails.commons.ApplicationHolder 

def ctx = ApplicationHolder.application.mainContext.servletContext 
def rootPath = ctx.contextPath 
+0

聽起來像一個有趣的方法,但由於某種原因,對我來說,似乎ConfigSlurper是存儲應用程序配置,而不是「外部數據」(用戶可以看到和修改的東西)。 – GalmWing 2012-04-15 17:00:57

+0

是的,同意這不是預想的用途,但它不適用? :P – txominpelu 2012-04-16 22:10:24