Groovy Динамический Список Взаимодействия - PullRequest
0 голосов
/ 08 июля 2011

Я использую старую версию grails (1.1.1) и работаю над устаревшим приложением для правительственного клиента.

Вот мой вопрос (в форме псевдо):

У меня есть домен, который является книгой.С ним связан поддомен типа 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']

Как динамически вызвать следующий код -

booklist.eachWithIndex(){
  key, value ->
  println key.fields
}

Цельчто я могу создать свою Карту полей и использовать цикл для быстрого отображения всех данных без необходимости вручную вводить все поля.

Примечание. - Точка в строке 'author.lastName' выдает ошибку при попыткеклавиша вывода ['author.lastName'] тоже.

1 Ответ

1 голос
/ 08 июля 2011

Я не помню версию Groovy, которая шла с Grails 1.1, но есть ряд языковых конструкций для таких вещей. Если это старая версия, некоторые вещи могут быть недоступны, поэтому ваш пробег может отличаться.

На ключи карты можно ссылаться с помощью строк кавычек, например,

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

Выше будет иметь ключ person.name на карте.

Карты могут содержать что угодно, в том числе смешанные типы в Groovy, поэтому вам действительно нужно обходить экранирование строк или другие особые случаи, если вы используете более сложные ключи.

Вы также можете использовать GString в указанном выше

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

Вы также можете динамически получить карту свойства / значения класса с помощью поля свойств. E.g.:

class Person { String name;String location; }
def bob = new Person(name:'Bob', location:'The City')
def properties = bob.properties
properties.each { println it } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...