2014-03-06 70 views
1

在我的ruby on rails應用程序中,實現了一個可以看到railscast視頻http://railscasts.com/episodes/396-importing-csv-and-excel的工具,它將直接同時導入和更新數據庫,但是當文件太大。在rails應用程序中保存並稍後導入xls,csv文件

所以我想寫一個工具來上傳我的應用程序中的csv或excel文件,並將其保存在一個目錄中。然後,我想添加一些觀察者來觀察目錄的內容,並且在該目錄中創建或更新文件等事件將觸發這些文件的內容以db方式上傳。我不知道如何解決這個問題。 在此先感謝。

+0

喜悅我不沒有看到你對答案的評論......這些都是你想要的嗎? – raviolicode

+0

不,實際上我不想使用Resque。我一直在尋找一些東西,以便csv數據導入到事件中,例如在文件上傳的某個目錄中更新和創建文件。 – Joy

+0

爲什麼不Resque,(或任何工人寶石)?您正在尋找的解決方案將不得不涉及對文件系統的某種輪詢,除非您沒有更好的選擇,否則這是一個糟糕的主意。無論如何,如果你想得到你需要的答案,你可以補充說,你在問題的**更新**部分沒有任何類型的工作人員? – raviolicode

回答

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被調用的方式(在readme中),但尚未實現。有關更多詳細信息,請參閱此Issue in Github

0

作爲替代Resque(和我認爲在後臺作業做是最好的方法),也見Spawnling,以前稱爲菌種:

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 
+1

在回答關於Heroku的(看似消失的)評論時,好像resque會在Heroku上工作(http://stackoverflow.com/questions/7407359/solution-for-background-jobs-on-heroku),我是不清楚產卵。如果Heroku是一個因素,那麼我認爲你應該修改你的問題,說這是一個Heroku託管的應用程序。 –

+0

馬克斯威廉斯 - 這是我,但我不知道我的問題是相關的。非常感謝! – raviolicode

相關問題