在我的ruby on rails应用程序中,实现了一个看到railscast视频http://railscasts.com/episodes/396-importing-csv-and-excel的工具,它将同时直接导入和更新数据库,但是当文件太大时会产生问题。
所以我想编写一个工具来在我的应用程序中上传csv或excel文件并将其保存在目录中。然后我想添加某种观察者,它将观察目录的内容,并且在诸如创建或更新该目录中的文件之类的事件中将触发要在db中上载的那些文件的内容。我不知道如何处理这个问题。 提前谢谢。
答案 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