Сохранение ActiveRecord нетранзакционно

Мое приложение принимает загрузки файла, при этом некоторые метаданные сохранены в 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

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

1
задан kenny_k 17 June 2010 в 14:26
поделиться

2 ответа

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

1
ответ дан 2 September 2019 в 23:42
поделиться

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

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

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

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

1
ответ дан 2 September 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: