在控制器或视图中访问Grails关联的域类?

时间:2013-09-01 21:38:53

标签: grails model-view-controller gorm

如果一个域类有许多引用其他域类的字段,那么访问控制器中的字段,将它们添加到模型或直接访问视图中的字段是否最佳?

换句话说,一个小模型比一个简单的视图更好,反之亦然?

例如:

// Controller
render(view: 'index', model: [b: a.b, c:a.b.c])

// View
${a}, ${c}, ${c.id}

Vs以上。

// Controller
render(view: 'index', model: [a: a])

// View
${a.b}, ${a.b.c}, ${a.b.c.id}

另外,这些替代品在Grails / GORM中是否具有性能影响?

1 个答案:

答案 0 :(得分:1)

我会说这完全取决于您的使用组织,但通常我会尝试将每个渲染调用中的模型中的条目数保持为小。

如果页面的一部分需要显示a,b和a.b.c的部分内容,那么将它们作为单个引用传递给“a”似乎没问题。

如果您正在显示的页面的不同部分,一个部分引用a,另一个部分引用ab,另一个部分引用abc,那么我建议您查找模板(http://www.slideshare.net/laelfrog/grails-layouts-sitemesh),然后通过“a”进入顶部,并将“ab”从该顶级页面传递到使用ab作为“b”等的部分模板中。

所以如果你的控制器有:

render( view: 'index', model: [a:a] )

index.gsp可能如下所示:

<g:render template="toplevel" model="[a: a]" />
<g:render template="midlevel" model="[b: a.b]" />
<g:render template="bottomlevel" model="[c: a.b.c]" />

然后,在模板_toplevel中,您可以使用“a”(实际上,对于此级别,传递模型是多余的,因为当前模型与控制器发送的模型相同)。

但是在_midlevel中,你可以将“a.b”作为“b”访问,而在_bottomlevel中,你可以将a.b.c作为“c”访问。每个模板应该知道它需要什么,并且应该真正拥有它们自己的名称,而不是依赖于2中的模型呈现链。

就优化而言,我怀疑这是一个问题,除非你一遍又一遍地重做很多工作来构建你的模型。仅仅取消引用儿童并不是一个真正的问题。