2010-12-11 7 views
0

だから我々は我々のGrailsのオブジェクト(参照データ)の一部のためのユニークな「コード」を持っている、と我々は彼らを取得したい場合、我々は彼らの静的コードでそれらを呼び出すことによってそれを行う:ベストプラクティス - 静的フィールドでgrailsのドメインオブジェクトを取得しますか?

Currency.findByCode(Currency.DOLLAR) 

おそらく、私はよ完全に間違っていますが、これはオブジェクトを検索する非常に冗長で非グルーヴな方法のようです(特に、複数のオブジェクトに対して複数回行う必要がある場合)。

もっと受け入れられるアプローチがありますか(多分、オブジェクト自体の参照はどこかにありますか)?これが最良の方法であれば、それは容認できる答えです。ありがとう。

答えて

2

によって異なります。これは参照データのようです。参照データが決して変更されない場合、私は永続性レイヤーをまったく使用しません。静的参照データである静的変数の束をコード化します。

再デプロイせずに参照データを変更できるようにするには、最も実用的な方法はdbからロードすることです。データを操作できる管理画面があります。 ehcacheのような第2レベルのキャッシュを使用して、パーシスタンスレイヤーが実際にdbにどれくらいの負荷をかけたかを制限します。この方法で本当に良いパフォーマンスを得ることができます。ユーザーガイドのセクション5.5.2.2を参照してください。

しかし、現在のアプローチでは、Currency.DOLLARをコーディングする必要があるため、参照データの変更に再デプロイする必要があります。これを行う必要はないのが良いでしょう。

はあなたが静的変数を使用している場合、コードを短くするために何ができる

もうひとつは、静的な輸入を(これは実際のJavaの一部ですが、私はGroovyのために移動するまで、私はそれを見つけることができませんでした)を使用することです

+0

@igsは、それは私が考える暗示されました。 ;)いずれにしてもあなたは正しい道にいる;) – hvgotcodes

3

あなたがCurrencyTypeの静的インポートを行う場合は(潜在的にあなたが定義した通貨の様々な種類を保持する列挙型)クラスの先頭に:あなたのコード内のダウン

static import com.example.CurrencyType.* 

が、あなたは、もはやする必要がすべての参照先にCurrencyTypeというプレフィックスを付ける場合は、次のようにします。

彼らは変更する必要がない場合は
Currency.findByCode(DOLLAR) 

、あなたもそれを取得するために、あなたの通貨クラスにヘルパーメソッドを追加することができます:あなたは、他のコードでCurrency.dollarを使用させます

Currency.groovy: 
static import com.example.CurrencyType.* 
... 
static transients = ['dollar'] 
... 
static Currency getDollar() { 
    Currency.findByCode(DOLLAR) 
} 

を。これらのクラスでは、あなたはまた、単にdollarを参照するためにそこに静的インポートを使用することができます。

static import com.example.Currency.* 
.... 
println dollar // gets the dollar from the db and prints it out 
関連する問題