Сохранение ActiveRecord без транзакций - PullRequest
1 голос
/ 17 июня 2010

Мое приложение поддерживает загрузку файлов, некоторые метаданные хранятся в БД, а сам файл - в файловой системе.Я пытаюсь сделать метаданные видимыми в приложении до завершения загрузки файла и последующей обработки, но поскольку сохранения выполняются транзакциями, я не добился успеха.Я пробовал обратные вызовы и вызов create_or_update () вместо save (), но все безрезультатно.Есть ли способ сделать это, не переписывая кишки ActiveRecord :: Base?Я даже пытался назвать метод make () вместо save (), но, к сожалению, это не дало результата.

Код ниже «работает» нормально, но база данных не изменяется, пока все остальное не будет завершено.

def save(upload)

uploadFile = upload['datafile']
originalName = uploadFile.original_filename
self.fileType = File.extname(originalName)

create_or_update()

# write the file
File.open(self.filePath, "wb") { |f| f.write(uploadFile.read) }
begin
  musicFile = TagLib::File.new(self.filePath())
  self.id3Title = musicFile.title
  self.id3Artist = musicFile.artist
  self.id3Length = musicFile.length
 rescue TagLib::BadFile => exc
    logger.error("Failed to id track: \n #{exc}")
end

if(self.fileType == '.mp3')
  convertToOGG();
end
create_or_update()

end

Любые идеи будут приветствоваться, спасибо.

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Вы получаете метаданные из файла, верно? Так проблема в том, что преобразование в OGG занимает слишком много времени, и вы хотите, чтобы данные отображались до преобразования?

Если это так, Джон выше имеет правильную идею - вам нужно будет принять загрузку файла и запланировать преобразование в будущем.

Основная причина в том, что ваш поток rails будет обрабатывать преобразование OGG и не сможет отвечать на любые другие веб-запросы, пока он не будет завершен. Взрыв!

Некоторые серверы компенсируют это наличием нескольких потоков rails, но я рекомендую фоновую очередь (используйте BJ, если вы используете хост, или фоновые задания Heroku, если вы там размещаете).

1 голос
/ 17 июня 2010

Рассматривали ли вы обработку загрузки файла как фоновую задачу? Сохраните метаданные как обычно, а затем выполните загрузку и последующую обработку, используя отложенное задание или аналогичное. У этого Railscast есть детали.

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