Перенос данных из одного действия Grails в другое - PullRequest
1 голос
/ 05 августа 2010

Для нашего приложения Grails я написал метод, который позволяет загружать CSV-файл, полный контактов, и он будет анализировать файл и создавать контакты из данных. Я использовал свой тестовый файл (жестко запрограммировал, какие поля означают что), и он прекрасно работает.

Но, конечно, я не могу оставить жестко запрограммированные ссылки на поля, поэтому мой следующий шаг - показать пользователю экран, позволяющий сопоставить столбцы в его файле с полями нашей базы данных (столбцы A и B содержат имена , столбец C содержит электронную почту и т. д.).

Мой вопрос: Каков наилучший способ временно сохранить данные, которые я извлекаю в первой части, чтобы их можно было использовать в конце второй? Доменный класс может показаться логичным выбором, но я не нашел изящного способа сделать это вообще. Hibernate, похоже, не любит двумерные строковые массивы, и для его реализации в режиме OO потребовалось бы несколько классов доменов (ImportedCsv, CsvRow). Допустимо ли иметь несколько классов доменов верхнего уровня для такого небольшого и временного процесса?

Я немного новичок Грааля, поэтому я не уверен, что хакерское, а что грациозное. Что бы вы сделали?

Ответы [ 4 ]

1 голос
/ 06 августа 2010
upload the file in the first action
store a blob in db 
parse the columns out display ui to map column to fields 
second action read the blob from db, create new domain objects, delete blob from db

Я думаю, что сохранение файла CSV в сеансе может привести к некоторым проблемам.

0 голосов
/ 06 августа 2010

Я бы согласился с Аароном Сондерсом и сказал бы, что вы должны сохранить его в базе данных. Это позволит вам сохранить состояние пользователей в случае истечения времени их сеанса.

Используйте форму, состоящую из нескольких частей, чтобы загрузить файл, затем выведите файл следующим образом:

def uploadedFile = request.getFile( 'image' )
csvDomainInstance.csvFile = uploadedFile.bytes

Ваш доменный объект может выглядеть так:

class ContactCsvFile {
  byte[] csvFile
  static constraints = {
    csvFile( nullable:true, maxSize:2097152 ) //2MB
  }
}

Затем, чтобы прочитать это, сделайте что-то вроде этого (не проверено):

def file = new File()
file.setBytes( csvDomainInstance.csvFile )
def csvText = file.getText()
0 голосов
/ 06 августа 2010

Первое, что пришло на ум при чтении вашего вопроса, было Grails Web Flows . Они основаны на проекте Spring Web Flow и позволяют легко реализовать последовательности представлений в стиле мастера. Думайте о них как о государственной машине. Вы также можете сохранить состояние между «шагами» в потоке, используя область действия потока.

0 голосов
/ 05 августа 2010

Сохранение данных в объекте сеанса. Вы можете хранить большинство произвольных данных, таких как массивы строк или хэш-карт в сеансе. Это будет продолжаться до тех пор, пока пользователь использует веб-приложение с периодом ожидания около 30 минут, хотя при необходимости его можно увеличить или уменьшить. После того, как пользователь прекратит использовать веб-приложение, время сеанса истечет. Если вам не нужно хранить данные после того, как пользователь завершит работу с вашим приложением, это, вероятно, самый простой способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...