我正在编写一个标签,该标签本质上需要为参数通过标签请求的字段转储任意域类。如果该字段是普通属性,则可以正常工作。但是,如果是“hasMany”关系,我有什么选择?
换句话说,如何检查作为参数传递给标签的字符串是否对应于“hasMany”关系,并获取相应的域名?
请注意,我可以实例化域类并对其进行getClass-也许它在属性中?我会检查的,但是任何输入都值得赞赏。
更具体地说,在下面的代码中,我需要检查是否有任何名称是与属性相对的“hasMany”关系,访问该域,并打印该域的所有实例。
这是不存在的代码:
/ *
*标记到输出域级别的信息
*
* /
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>"
}
最佳答案
域类应始终为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
关于grails - Groovy/Grails-如何检查Domain类中的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2065808/