Saving an ActiveRecord non-transactionally.

Posted by theFunkyEngineer on Stack Overflow See other posts from Stack Overflow or by theFunkyEngineer
Published on 2010-06-17T14:26:24Z Indexed on 2010/06/17 15:03 UTC
Read the original article Hit count: 190

My application accepts file uploads, with some metadata being stored in the DB, and the file itself on the file system. I am trying to make the metadata visible in the application before the file upload and post-processing are finished, but because saves are transactional, I have had no success. I have tried the callbacks and calling create_or_update() instead of save(), all to no avail. Is there a way to do this without re-writing the guts of ActiveRecord::Base? I've even attempted naming the method make() instead of save(), but perplexingly that had no effect.

The code below "works" fine, but the database is not modified until everything else is finished.

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

Any ideas would be quite welcome, thanks.

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about activerecord