代码之家  ›  专栏  ›  技术社区  ›  kenny_k

非事务性保存ActiveRecord

  •  1
  • kenny_k  · 技术社区  · 16 年前

    我的应用程序接受文件上载,其中一些元数据存储在数据库中,文件本身存储在文件系统中。我试图在文件上传和后处理完成之前在应用程序中显示元数据,但是由于保存是事务性的,所以我没有成功。我尝试过回调,并调用create_或_update()而不是save(),但都无效。有没有一种方法可以做到这一点而不需要重新编写activeRecord::base的内部结构?我甚至尝试命名方法make()而不是save(),但令人费解的是,它没有任何效果。

    下面的代码“正常工作”,但在完成所有其他工作之前,数据库不会被修改。

    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
    

    任何想法都很受欢迎,谢谢。

    2 回复  |  直到 16 年前
        1
  •  1
  •   John Topley    16 年前

    您是否考虑将文件上载作为后台任务处理?正常保存元数据,然后使用延迟作业或类似作业执行上载和后处理。 This Railscast 有细节。

        2
  •  1
  •   Jesse Wolgamott    16 年前

    你正在从文件中获取元数据,对吗?那么,转换为ogg所需的时间是否太长,您是否希望数据在转换之前出现?

    如果是这样的话,上面的约翰有一个正确的想法——你需要接受文件上传,并计划在将来某个时候进行转换。

    主要原因是Rails线程将处理ogg转换,在完成之前无法响应任何其他Web请求。爆炸!

    一些服务器通过拥有多个Rails线程来补偿这一点,但我建议使用后台队列(如果您自己托管,请使用bj;如果您托管在那里,请使用heroku的后台作业)。

    推荐文章