Обновление многих элементов с использованием того же идентификатора в Grails - PullRequest
1 голос
/ 30 ноября 2011

Я сохраняю значения в двух таблицах asset и asset_history. При создании актива я сохраняю значения в таблице актива, если требуется какое-либо обновление, то мне нужно время для сохранения в asset и asset_history на базе идентификаторов.Теперь я хочу получить значение двух таблиц на странице редактирования для получения asset_history. Я использовал sql-запрос для получения значений в asset_history.all работают хорошо и нормально, но он поступает в значениях списка массивов (весь список обновлений отображается в одной строке).Я обновляю значения на странице редактирования, которую он должен сохранить и показать в разных строках 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.

редактировать действие

    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 значения попадают в массив и показываютОбновленный список в одной строке. Но я хочу показать его в отдельной строке, когда я обновляю каждый раз. Я использовал цикл for для этого, но он не работает. Пожалуйста, помогите мне решить эту проблему.

1 Ответ

2 голосов
/ 30 ноября 2011

Ваша проблема в том, что вы можете вернуть только одно значение из функции в Groovy (и на всех других языках, которые я знаю в любом случае).Поэтому первая итерация в вашем цикле for возвращает и следующие итерации (где вы ожидаете вернуть больше экземпляров) не выполняются.

Вы должны вернуть список и использовать тег <g:each> в своем файле GSP (которыйэквивалентно циклу for в GSP):

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 здесь
  • Избегайте использования SQL и предпочитайте полагаться на встроенные методы доступа Grails (findBy) или Критерии гибернации, если ваша история утверждений является объектами домена Grails.Это даст вам объекты Grails вместо raw SQL строк
  • Правильный отступ вашего кода для удобства чтения.Скорее всего, в вашей IDE есть функция, которая может сделать это за вас.
...