Groovy / Grails - Как проверить отношения в классе домена? - PullRequest
1 голос
/ 14 января 2010

Я пишу тег, который, по сути, должен создать дамп произвольного класса домена для полей, запрошенных через параметры для тега. Это прекрасно работает, если поле является нормальным атрибутом. Но, если это отношения "hasMany", каковы мои варианты?

Другими словами, как я могу проверить, соответствует ли строка, переданная в качестве параметра тегу, отношению hasMany, и получить соответствующее доменное имя?

Обратите внимание, что я могу создать экземпляр класса домена и создать для него getClass - может быть, это в свойствах? Я проверю, но любой вклад очень ценится.

Чтобы быть более точным, в следующем коде мне нужно проверить, является ли какое-либо из имен отношением hasMany в отличие от атрибута, получить доступ к этому домену и распечатать все его экземпляры.

Вот код, как он существует nos:

/ * * Тег для вывода информации об уровне домена * * /

def get_domain_info = { attrs, body ->


    // get the domain name for lookup on the Misc Fields XML table
    def id = attrs['id']


    def domainName = attrs['domain_name']

    // get the domainInstance
    def domainInstance = grailsApplication.getArtefact("Domain",domainName)?.
    getClazz()?.get(id)


    def dataNames = attrs['data_names']

    def dataNameArray = dataNames.split(",")

    out << "<div class=\"dialog\">"

    for(dataName in dataNameArray) {
        out << "<tr class=\"prop\">"
        out << "<td valign=\"top\" class=\"name\">"  + dataName + "</td>"
        def dataValue = domainInstance[dataName.trim()]
        if (dataValue == null){
            dataValue = ""
        }
        def valueLine
        if ( dataValue.class == java.sql.Timestamp){
            valueLine = "<td valign=\"top\" class=\"value\">"  +
            dataValue.format("d MMM yyyy") +  "</td>"
        }
        else {
            valueLine = "<td valign=\"top\" class=\"value\">"  + dataValue + "</td>"
        }
        out << valueLine
        out << "</tr>"

    }

1 Ответ

0 голосов
/ 14 января 2010

Класс домена должен всегда иметь свойство Set или List, определенное для hasMany, например:

class Author {
   static hasMany = [books:Book]
   List books
}

Таким образом, в этом случае domainInstance[dataName] вернет список книг. Все, что вам действительно нужно сделать, это посмотреть, является ли объект коллекцией:

 if(dataValue instanceof Collection) {
     // handle hasMany
 }

В некоторых странных случаях hasMany также может быть картой. Смотри http://www.grails.org/GORM+-+Collection+Types

...