Grails模型相当新,并且在使用服务进行数据库事务时遇到一些麻烦。
服务:
class ReportService {
def dataSource
def listDatatypeValues(Datatype dt) {
def sql = new Sql(dataSource)
def list = sql.rows (dt.statement)
return list
}
}
控制器:
def run(Long id) {
def reportInstance = Report.get(id)
def listPromptValues = populatePrompts(reportInstance)
if (!reportInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'report.label', default: 'Report'), id])
return
}
[reportInstance: reportInstance, listPromptValues: listPromptValues]
}
def populatePrompts(Report rp){
//for a prompt in the report, go out and get it's values
rp.prompts.each {
List list = reportService.listDatatypeValues(it.datatype)
}
}
查看摘要:
<g:if test="${reportInstance?.prompts}">
<li class="fieldcontain">
<g:each var="prompt" in="${reportInstance.prompts}">
<g:if test="${prompt.datatype.type == 'DropDown'}">
<g:select id="prompt.name" from="${listPromptValues}" name="prompt.name" value="" noSelection="['':'']"/>
</g:if>
</g:each>
</li>
</g:if>
我们有一个报表对象,其中包含提示,而提示又包含数据类型。对于任何给定的报告,当它在UI上提取时,它将提供报告详细信息,然后列出给定提示的提示值。问题是当前设置是将对象引用列为提示值,而不是从服务返回的值列表。
例如,报告1有2个提示,即开始术语代码和结束术语代码。它们都使用Term Code作为数据类型,因为它是相同的SQL查询,listDataTypeValues返回的列表将是存储在数据库中的70多个术语代码的列表。
有任何想法或方向吗?
我尝试跟随this,但我无法让它发挥作用。
谢谢!
答案 0 :(得分:1)
您的populatePrompts
函数未返回有意义的值。如果使用collectMany
而不是each
进行迭代,则表达式的值将是查询中所有结果的串联。尝试这样的事情:
def populatePrompts(Report rp){
rp.prompts.collectMany {
reportService.listDatatypeValues(it.datatype)
} //.unique()
}
您可能还希望在结果上调用唯一,以避免在g:select
输入中出现重复。