我有两个与一对多关系相关的域 - 一个用户可能有很多关联。我想查看属于该用户的所有关联。我正在使用脚手架插件。所以应该在AssociationController中返回关联列表的代码看起来很简单:
def index(Integer max) {
respond Association.list(params), model:[associationInstanceCount: Association.count()]
}
在用户视图页面上,我有以下代码:
<g:form controller="Association" >
<fieldset class="buttons">
<g:hiddenField name="user.id" id="user.id" value="${userInstance.id}"/>
<g:actionSubmit class="list" action="index" value="${message(code: 'default.list.label', default: 'Show Associations')}"/>
</fieldset>
</g:form>
当我按下此动作时,提交user.id
随请求一起发送,它在params地图内(我通过调试检查)但由于某种原因,Association.list(params)
返回所有关联(对于所有用户),尽管事实上我在params中使用这个user.id。还尝试将user.id
重命名为user
,但它也无效。看起来像这样.list()应该只用于排序或者我做错了。你能帮我解决这个问题吗?谢谢!
答案 0 :(得分:5)
澄清给定的答案:list( params )
返回域对象的所有结果,并仅接受排序(order by)和view-port(limit / offset)参数。它不提供任何where
子句(除了discriminator
- 列)
更新:
您可以使用findAllBy*
:
Association.findAllByUserId( params.long( 'user.id' ), params )
或criteria
如果您需要使查询更复杂:
Association.withCriteria{
eq 'id', params.long( 'user.id' )
maxResults params.int( 'max' ) ?: 10
firstResult params.int( 'offset' ) ?: 0
if( params.sort && params.order ) order params.sort, params.order
}
答案 1 :(得分:4)
根据Grails documentation,list不会将id作为参数。
看到你的最大值,它将是Association.list(max: max)
,而你想要的是:
Association.findAllByUserId(params.id, [max: max])
params.id
包含所需用户的id
(或params['user.id']
)。
更多关于findAllBy...
答案 2 :(得分:2)
不确定之前的回复,但是:
Association.where {
user {
eq 'id', params['user.id']
}
} .list()
如果使用分页,可以将params添加到列表调用。
另一种解决方案:
def index(User user) {
respond user.associations, , model:[associationInstanceCount: user.associations.size()]
}
但是你必须为你的param'id'命名 这主要取决于您如何设计域对象以及您的目标是什么。