我有简单的层次结构:
class Atom {}
class Text extends Atom { String value}
class Unit {
List atoms
static hasMany = [ atoms:Atom ]
}
假设我们创建了一个Text对象和一个Unit对象,并选择Unit作为Text的父对象。它工作正常。当我在Unit上调用show方法时,我看到我的Unit包含一个Atom。当我点击这个原子时,它会将我重定向到原子控制器,但我的原子实际上是文本,我想看看文本控制器。这是预期的行为,因为在我的show.gsp中有这样的代码:
<g:each in="${unitInstance.atoms}" var="a">
<span class="property-value" aria-labelledby="atoms-label">
<g:link controller="atom" action="show" id="${a.id}">
${a?.encodeAsHTML()}
</g:link>
</span>
</g:each>
好的,数据库将实际的原子类型存储在字段“class”中,所以我编辑了第3行:
<g:link controller="${a.class}" action="show" id="${a.id}">
$ {a.class}总是返回原子。 所以,我的问题是 - 我们怎样才能获得实际的班级名称?
答案 0 :(得分:1)
可能有更好的方法,但是如何在Atom中添加一个方法并在Text中覆盖它,返回相应的字符串?
答案 1 :(得分:1)
你可能正在点击关于Hibernate返回代理的GORM Gotcha而不是膨胀的对象。
在您的链接中,您可以尝试:
<g:link controller="${Atom.get(a.id).getClass()}" ... />