2010-06-17 65 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的後臺作業)。