Groovy / Grails - 如何检查Domain类中的关系?

时间:2010-01-14 16:43:48

标签: grails groovy tags

我正在编写一个标记,基本上需要将通过参数请求的字段的任意域类转储到标记。如果该字段是普通属性,则此方法正常。但是,如果它是“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 :(得分:0)

域类应始终具有为hasMany定义的Set或List属性,例如:

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

因此,在这种情况下,domainInstance[dataName]将返回图书清单。您真正需要做的就是查看该属性是否为Collection:

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

是一些奇怪的案例,一个hasMany也可以是一个Map。见http://www.grails.org/GORM+-+Collection+Types