在grails中使用相同的id更新许多项目

时间:2011-11-30 06:15:52

标签: grails groovy grails-controller

我正在两个表asset和asset_history中保存值。创建资产我正在资产表中保存值,如果有任何更新,我希望它存储在资产和asset_history的id基础上。现在我想在编辑页面中获取两个表值以获取asset_history我使用sql查询来获取asset_history.all中的值正在运行良好但是它正在以数组列表值(所有更新列表显示在单行中)。当我在编辑页面中的updata值应保存并显示在asset_history的不同行中。因为我用于循环,但它没有获得价值。

资产表我有以下字段: -

     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中显示并在单行中显示更新列表。但是我希望在每次更新时将它显示在单独的行中。我使用for循环但是它不起作用。请指导我来解决这个问题。

1 个答案:

答案 0 :(得分:2)

您的问题是您只能从Groovy中的函数(以及我知道的所有其他语言)中返回一个值。因此,for循环中的第一次迭代将返回,并且不会执行以下迭代(您希望返回更多实例的位置)。

您必须返回一个列表并在GSP文件中使用<g:each>标记(这相当于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>

作为奖励,这里有一些技巧可以让您的应用程序看起来更好:

  • 如果您未在GSP中使用这些值,请不要返回值,例如assertInstance
  • 如果您的断言历史记录是Grails域对象,请避免使用SQL并更喜欢依赖Grails内置访问方法(findBy)或Hibernate Criteria。这将为您提供Grails对象而不是原始 SQL行
  • 为了便于阅读,请正确缩进代码。您的IDE有可能为您做到这一点。