0

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 に表示されると、レポートの詳細が表示され、特定のプロンプトのプロンプト値が一覧表示されます。問題は、現在のセットアップが、サービスから返された値のリストではなく、プロンプト値としてオブジェクト参照をリストしていることです。

例として、Report 1 には、Starting Term Code と Ending Term Code の 2 つのプロンプトがあります。どちらも同じ SQL クエリであるため、用語コードをデータ型として使用し、listDataTypeValues から返されるリストは、データベースに保存されている 70 以上の用語コードのリストになります。

考えや方向性はありますか?

これに従ってみましが、うまくいきません。

ありがとう!

4

1 に答える 1

1

populatePrompts関数が意味のある値を返していません。collectMany式の値の代わりに繰り返し処理するとeach、クエリからのすべての結果が連結されます。次のようなことを試してください:

def populatePrompts(Report rp){
    rp.prompts.collectMany {
        reportService.listDatatypeValues(it.datatype)
    } //.unique()
}

入力の重複を避けるために、結果に対して unique を呼び出すこともできますg:select

于 2012-12-27T22:50:02.330 に答える