2010-06-17 28 views
1

我的应用程序接受文件上传,一些元数据存储在数据库中,文件本身在文件系统上。我试图在文件上传和后期处理完成之前在应用程序中使元数据可见,但由于保存是事务性的,因此我没有成功。我已经尝试过回调,并调用create_or_update()而不是save(),都无济于事。有没有办法做到这一点,而不重写ActiveRecord :: Base的胆量?我甚至试图命名方法make()而不是save(),但是令人困惑的是没有任何效果。非事务性地保存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 

任何想法都会非常受欢迎,谢谢。

+0

更正:数据库在上传完成后,但在转换完成之前被修改。这一刻变得越来越陌生。 – theFunkyEngineer 2010-06-17 15:37:19

回答

1

你有没有考虑处理文件上传作为后台任务?按正常方式保存元数据,然后使用“延迟作业”或类似方式执行上载和后期处理。 This Railscast有详细信息。

1

您正在从文件中获取元数据,对吧?那么转换为OGG所花费的时间太长,您希望数据在转换之前出现?

如果是这样,约翰上面有正确的想法 - 您将需要接受文件上传,并安排将来某个时间进行转换。

主要原因是您的rails线程将处理OGG转换,并且在完成之前无法响应任何其他web请求。爆破!有些服务器通过使用多个导轨线程来弥补这一点,但我推荐使用背景队列(如果您主持自己,则使用BJ,或者如果您在主机中使用Heroku的后台作业)。