使用Grails 2.4.4,我有一个.gsp页面,它返回一个如下所示的参数:
['update':'Update Budget',
'enteredAcct':['1018', '1200', '5301'],
'enteredOrg':['010', '010', '010'],
'enteredBudget':['100', '500', '200'],
'action':'updateBudget',
'format':null,
'controller':'orgs']
键的列表中的值的数量可以从1..x变化(但它们的大小都相同)。有没有更简洁的方法将此信息保存到数据库?
我的.gsp是:
<g:each in="${orgnList}" var="orgs">
<tr>
<td> ${orgs.acctCode}</td>
<td> <g:textField name="enteredBudget" value="${orgs.budget}"/></td>
<td> <g:hiddenField name="enteredOrg" value="${orgs.orgCode}"/> </td>
<td> <g:hiddenField name="enteredAcct" value="${orgs.acctCode}"/></td>
</tr>
</g:each>
显示给定组织的帐户和预算,并允许您仅为“预算”输入新值。
我的控制器如下:
(0..params.enteredAcct.size()-1).each{new Budget(
orgCode: params.enteredOrg[it],
acctCode: params.enteredAcct[it],
budget: params.enteredBudget[it],
activityDate: new Date()
).save(flush:true)}
哪个有效,但是如果我的params每个键只有1个值,则闭包不起作用,因为enteredAcct(或任何其他键)不再是列表,而是String。
我主要只是想看看是否有更有效的方法来保存返回的params Map,其中包含每个键的值列表,在这种情况下bindData似乎不起作用,这可能是预期的。 / p>
我总是可以检查params.enteredAcct instanceof List是否使用该闭包,如果没有,只需保留单个值,但我觉得这段代码中有很多噪音。我也不喜欢使用flush:如果可能的话,是真的,但是使用该闭包,除非强制刷新,否则.save()似乎不起作用。
由于
答案 0 :(得分:0)
对于这种情况,list中的方法GrailsParameterMap。
params.enteredAcct // could be String or String[]
params.list('enteredAcct') // Always a List<String>
使用它的另一个好处是,因为&#34;是多个&#34;例如,你得到的是列表而不是数组(至少在Grails 2.2.x中,原始参数值是一个数组)。
至于同花顺,你不需要它 - 但数据不会打到数据库直到会话被刷新,同时对象将保留在Hibernate的会话中。每个请求都会打开一个会话,因此在请求完成时它会关闭(并刷新)。每当请求读取操作(DomainClass.findBy...
,DomainClass.get...
等)时,它也会被刷新。一直冲洗的性能较差,所以我会避免它。
您可以使用save(failOnError:true)
,以确保在提供无效数据时尽快失败。并且可能将其移至服务以使用其交易功能。