2011-07-07 11 views
0

古いバージョンのgrails(1.1.1)を使用しています。政府のクライアント用の従来のアプリケーションで作業しています。私は本であるドメインを持っているGroovy Dynamic List Interaction

は、ここで(擬似の形で)私の質問です。それには、それに関連付けられたタイプAuthorのサブドメインがあります(1:多くの関係)。 Authorドメインには、firstNameおよびlastNameフィールドがあります。

def c = Book.createCriteria() 
     def booklist = c.listDistinct { 
      author { 
       order('lastName', 'asc') 
       order('firstName', 'asc') 
      } 
} 

ここで、後でExcelエクスポートに使用するフィールドのリストがあるとします。このリストには、作成者のドメイン呼び出しと、使用する列のタイトルがあります。

Map fields = ['author.lastName' : 'Last Name', 'author.firstName', 'First Name'] 

私は動的に呼び出すことができますどのように、次のcode--

booklist.eachWithIndex(){ 
    key, value -> 
    println key.fields 
} 
意図は、私はフィールドの私の地図を作成し、すべてを入力しなくても、すぐにすべてのデータを表示するためにループを使用することができるということです

手でフィールド。

注 - 文字'author.lastName'のピリオドは、キー['author.lastName']を出力しようとするとエラーをスローします。

+0

これは基本的にはhttp://stackoverflow.com/q/4077168/6509と同じ質問です –

答えて

1

Grails 1.1に付属しているGroovyのバージョンは思い出せませんが、このようなことを行うための言語構造がいくつかあります。古いバージョンの場合は、利用できない可能性があるため、マイレージが異なる場合があります。

マップキーは引用符で囲んで指定することができます。

def map = [:] 
map."person.name" = "Bob" 

上記のマップには、person.nameというキーがあります。

マップには、Groovyの混合型を含むものが含まれている可能性があります。複雑なキーを使用している場合は、実際には文字列エスケープやその他の特殊なケースを回避する必要があります。

また、あなたはまた、その上にプロパティフィールドによって動的にクラスのオフプロパティ/値のマップを取得することができます上記

def map = [:] 
def prop = "person.name" 
map."${prop}" = "Bob" 

でGストリングを使用することができます。例:

class Person { String name;String location; } 
def bob = new Person(name:'Bob', location:'The City') 
def properties = bob.properties 
properties.each { println it }