1

私は2つのテーブルassetとasset_historyに値を保存しています。アセットの作成時に、更新が必要な場合はアセットテーブルに値を保存しています。今、asset_history を取得するために編集ページで 2 つのテーブルの値を取得したいのですが、SQL クエリを使用して asset_history の値を取得しました。編集ページの値を更新して、asset_history の別の行に保存して表示する必要があります。そのために for ループを使用しましたが、値を取得していません。

資産テーブルには次のフィールドがあります:-

     id
      asset_title
      asset_description
      client_id
      comment
      status
etc...

asset_history フィールド:-

id
comment
update_on
update_by
status

アセット フィールドが更新された場合。更新リストは、asset と asset_history の両方に保存する必要があります。クエリを使用して更新しました (以下を参照)。しかし、asset_history テーブルで arraylist を取得しています。

編集アクション

    def dataSource
def edit={
    def assetInstance = Asset.get(params.id)
        if (!assetInstance) { 

            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'asset.label', default: 'Asset'), params.id])}"
            redirect(action: "list")
        }
        else {  Sql sql = new Sql(dataSource) 
             def result = sql.rows("SELECT * from asset_history where id ='"+params.id+"' ")
            //def n=result

            /*  def arr = (String[])result
                        for(i in 0 .. result.size()-1)
                         {

            return [assetInstance: assetInstance,result:i]
                         }*/
                   return [assetInstance: assetInstance,result: result]
        }

    }

edit.gsp 内

<tbody>

                        <tr>


                          <td>${result.id}</br></td>
                            <td>${result.comment}</br></td>

                            <td>${result.update_on}</br></td>
                           <td>${result.update_time}</br></td>
                               <td>${result.update_by}</br></td>

                        </tr>

                    </tbody>

asset_history テーブルでは、値が arraylist に取得され、更新されたリストが 1 行に表示されます。しかし、更新するたびに別の行に表示したいのですが、これには for ループを使用しましたが、機能していません。解決方法を教えてください。この問題。

4

1 に答える 1

2

あなたの問題は、Groovy(そしてとにかく私が知っている他のすべての言語)の関数から1つの値しか返すことができないということです。したがって、forループの最初の反復は戻り、次の反復(より多くのインスタンスを返すことが予想される場合)は実行されません。

リストを返し、<g:each>GSPファイルでタグを使用する必要があります(これはGSPのforループに相当します)。

def edit = {
  def assetInstance = Asset.get(params.id)
  if (!assetInstance) {
    flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'asset.label', default: 'Asset'), params.id])}"
    redirect(action: "list")
  }
  Sql sql = new Sql(dataSource) 
  def results = sql.rows("SELECT * from asset_history where id ='" + params.id + "' ")
  return [results: results]
}

そしてあなたのGSP:

<tbody>
  <g:each var="result" in="${result}">
    <tr>
      <td>${result.id}</br></td>
      <td>${result.comment}</br></td>

      <td>${result.update_on}</br></td>
      <td>${result.update_time}</br></td>
      <td>${result.update_by}</br></td>
    </tr>
  </g:each>
</tbody>

ボーナスとして、アプリケーションの見栄えを良くするためのヒントをいくつか紹介します。

  • assertInstanceここのように、GSPで値を使用しない場合は、値を返さないでください
  • findBySQLの使用を避け、アサート履歴がGrailsドメインオブジェクトである場合は、Grailsの組み込みアクセスメソッド()またはHibernateCriteriaに依存することをお勧めします。これにより、生のSQL行の代わりにGrailsオブジェクトが返されます
  • 読みやすくするために、コードを正しくインデントします。IDEには、それを実行できる機能がある可能性があります。
于 2011-11-30T07:31:49.327 に答える