2017-05-17 12 views
0

私のプロジェクトには多くのドメインクラスがあります。それらの多くは型の列を持っています。例えば:UserテーブルはuserTypeカラム、BookテーブルはbookTypeカラムを持っています。私はしばしばBookType.list()メソッドを呼び出して、これらのタイプをGSP g:selectソースに渡します。しかし問題は、GSPにg:selectがたくさん含まれている場合、冗長なクエリをたくさん実行する必要があるということです。grailで定数を持つドメインを設計する最良の方法

そして私は、私は私も同じ問題を抱えている方法ここで

Book book = new Book(); 
book.bookType = BookType.findByName(BookTypes.COMICS); 

以下でDBからこれらの定数の型を取得する必要があり、新しいドメインインスタンスを作成するときに別の問題があるが、私は冗長なクエリを実行する必要があります。これらの冗長なクエリを実行せずにこれらのすべてを実行する良い設計はありますか?

答えて

1

typesが非常に揮発性でない場合は、タイプがenumと定義されていることがわかります。 enumを使ってみてください。つまり、データベーステーブルを気にしないでください。例えば、

enum SomeType { 

    TYPE1(1, "Type 1"), 
    TYPE2(2, "Type 2"), 
    TYPE3(3, "Type 3") 

    final int id 
    final String value 

    private SomeType(int id, String value) { 
     this.id = id 
     this.value = value 
    } 

    // Might be needed for <g:select> tags, I'm not very sure 
    int getKey() { id } 

    static SomeType byId(int id) { 
     values().find { it.id == id } 
    } 
} 

はその後、自分のドメインで、何かのような操作を行い、

class SomeDomain { 

    static constraints = { 
     ... 
     type nullable: false 
     ... 
    } 

    ... 
    SomeType type 
} 

その後、あなたは、単にこのような何かを行うことができ、

SomeDomain book = new SomeDomain(..., type: SomeType.TYPE1, ...); 
+0

BookType.listを処理する方法( )? –

+1

@EmdadulSawon:答えはすでに与えられています。私はそこで定義したbyId(...)メソッドに気付きました。あなたが正しいです、 'BookType.values()'は行く方法です。 –

関連する問題