2010-06-17 3 views
1

내 응용 프로그램은 일부 메타 데이터가 DB에 저장되고 파일 자체는 파일 시스템에 저장되는 파일 업로드를 허용합니다. 파일 업로드 및 사후 처리가 끝나기 전에 응용 프로그램에서 메타 데이터를 볼 수있게하려고합니다. 그러나 저장은 트랜잭션이기 때문에 성공하지 못했습니다. 콜백을 시도하고 save() 대신 create_or_update()를 호출하여 아무 소용이 없다. ActiveRecord :: Base의 용기를 다시 쓰지 않고도이 작업을 수행 할 수 있습니까? 나는 심지어 save() 대신에 make() 메서드의 이름을 지정하려고 시도했으나 아무런 효과가 없었습니다.비 트랜잭션 방식으로 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

수정 사항 : 업로드가 완료되었지만 변환이 완료되기 전에 DB가 수정됩니다. 이것은 순간적으로 낯선 사람이되고 있습니다. – theFunkyEngineer

답변

1

파일 업로드를 백그라운드 작업으로 처리한다고 생각하십니까? 메타 데이터를 정상적으로 저장 한 다음 지연된 작업 또는 유사 작업을 사용하여 업로드 및 사후 처리를 수행하십시오. This Railscast에는 자세한 내용이 있습니다.

1

파일에서 메타 데이터가 표시됩니다. 맞습니까? OGG 로의 변환이 너무 오래 걸리는 문제가 있으며 변환 전에 데이터를 표시하고 싶습니까?

그렇다면 위의 John은 올바른 생각을 가지고 있습니다. 파일 업로드를 수락하고 언젠가는 나중에 전환이 발생하도록 예약해야합니다.

레일즈 스레드가 OGG 변환을 처리하고 완료 될 때까지 다른 웹 요청에 응답 할 수없는 주된 이유는 무엇입니까? 쏘다!

일부 서버는 여러 개의 레일 스레드를 사용하여이를 보완하지만 백그라운드 대기열을 사용하는 것이 좋습니다 (호스트하는 경우 BJ를 사용하거나 호스트하는 경우 Heroku의 백그라운드 작업).

관련 문제