保存并稍后在rails应用程序中导入xls,csv文件

时间:2014-03-06 13:56:55

标签: ruby-on-rails

在我的ruby on rails应用程序中,实现了一个看到railscast视频http://railscasts.com/episodes/396-importing-csv-and-excel的工具,它将同时直接导入和更新数据库,但是当文件太大时会产生问题。

所以我想编写一个工具来在我的应用程序中上传csv或excel文件并将其保存在目录中。然后我想添加某种观察者,它将观察目录的内容,并且在诸如创建或更新该目录中的文件之类的事件中将触发要在db中上载的那些文件的内容。我不知道如何处理这个问题。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

我认为最好的方法是使用Resque从请求中单独导入和转换。

假设您有一个控制器来添加Excel文件,我打算将其称为Information模型:

class InformationController < ApplicationController
  def create
    @information = Information.new(params[:information])
    if @information.save
      resque = Resque.enqueue(ImportDataJob, @information.id)
      redirect_to @information, :notice => "Successfully created information for further processing."
    else
      render :new
    end
  end
end

你需要找一份工作,在这种情况下ImportDataJob

class ImportDataJob
  def self.perform(information_id)
    information = Information.find(information_id)
    # convert information.raw_csv or wherever attribute you saved the Excel or CSV into
    # and save it into the database where you need to
  end
end

您将在Resque RailsCast中找到完整的教程,其中显示了如何将Resque添加到现有的Rails应用程序中。

注意: README与Resque的实际实现之间存在冲突。显然他们想要改变调用Resque的方式(在自述文件中),但尚未实现。有关详细信息,请参阅此Issue in Github

答案 1 :(得分:0)

作为Resque的替代品(我认为在后台工作中这样做是最好的方法),另请参阅Spawnling,以前称为Spawn:

https://github.com/tra/spawnling

超低维护。在您的控制器操作中执行类似

的操作
@file = <uploaded file here>
spawn do 
  #perform some long-running process using @file, in a new process
end
#current thread carries on straight away.

如果您需要测试它是否已完成(或因此而崩溃),您可以保存新进程的ID,如下所示:

@file = <uploaded file here>
spawner = spawn do 
  #perform some long-running process using @file, in a new process
end

#current thread carries on straight away.

spawner = spawn do
  #make it in a temp file so serve_if_present doesn't serve a halfmade file
  FileUtils.rm @filename if File.exists?(@filename)
  temp_filename = "#{@filename}.temp"
  ldb "temp_filename = #{temp_filename}"
  current_user.music_service.build_all_schools_and_users_xls(:filename => temp_filename)
  FileUtils.mv temp_filename, @filename
end
@spawn_id = spawner.handle