Мое приложение принимает загрузки файла, при этом некоторые метаданные сохранены в DB и самом файле в файловой системе. Я пытаюсь сделать метаданные видимыми в приложении, прежде чем загрузка файла и последующая обработка будут закончены, но потому что сохраняет, являются транзакционными, я не имел никакого успеха. Я попробовал обратные вызовы и звонящий create_or_update () вместо сохранения (), все напрасно. Есть ли способ сделать это, не переписывая кишки ActiveRecord:: Основа? Я даже попытался, именование метода делают () вместо сохранения (), но загадочно который не имел никакого эффекта.
Код ниже прекрасных "работ", но база данных не изменяется, пока все остальное не закончено.
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
Любые идеи довольно приветствовались бы, спасибо.
Рассматривали ли вы обработку загрузки файла как фоновую задачу? Сохраните метаданные как обычно, а затем выполните загрузку и постобработку с помощью отложенного задания или аналогичного. В Railscast есть подробности.
Вы получаете метаданные из файла, верно? Так проблема в том, что преобразование в OGG занимает слишком много времени, и вы хотите, чтобы данные отображались до преобразования?
Если это так, Джон, представленный выше, имеет правильную идею - вам нужно будет принять загрузку файла и запланировать преобразование в будущем.
Основная причина в том, что ваш поток rails будет обрабатывать преобразование OGG и не может отвечать на любые другие веб-запросы до его завершения. Взрыв!
Некоторые серверы компенсируют это наличием нескольких потоков rails, но я рекомендую фоновую очередь (используйте BJ, если вы размещаете себя, или фоновые задания Heroku, если вы размещаете там).