2013-05-07 132 views
0

我有一個包含數千行的excel文件。在我的情況下,我不能使用批量插入,因爲對於每一行我都應該創建幾個關聯。現在,所有的過程需要20多行,超過1小時,這是地獄。解決這個問題的最好方法是什麼?將巨大的Excel文件導入到Rails應用程序中

我正在使用電子表格寶石

+1

您是否考慮過排隊機制,例如Resque,Delayed Job,Simple Queue或Sidekiq? – 2013-05-07 23:49:45

+0

這是一個終極解決方案。根據要求加載更多更喜歡。 – Meliborn 2013-05-07 23:53:01

回答

4

這類似於Rails喜歡遇到的臭名昭着的「1 + N」查詢情況。我有類似的情況(導入20k +行與多個關聯文件)。我優化此過程的方式是預加載關聯的哈希值。因此,舉例來說,如果你有一個AssociatedModel包含lookup_column這是您的進口數據,你會先建立一個哈希:

associated_model_hash = Hash.new(:not_found) 

AssociatedModel.each do |item| 
    associated_model_hash[item.lookup_column] = item 
end 

這提供對象的哈希值。您可以重複儘可能多的關聯。在您的導入循環:

associated_model = associated_model_hash[row[:lookup_column]] 
new_item.associated_model_id = associated_model.id 

因爲你不必每次都做對數據庫進行搜索,這是要快得多。它還應該允許您使用批量插入(假設您可以保證在加載過程中不會刪除或修改相關模型)。

+0

好的答案,我在PHP/MySQL的工作中遇到了這個問題,儘管在一個不是MVC的系統中。我一直想知道如何避免N + 1一段時間。值得添加的答案是:not_found是ActiveRecord :: RecordNotFound的一個符號,所以如果一個非有效的密鑰傳遞給哈希,那麼哈希將返回而不是零。我瞭解哈希如何工作,但必須查找:not_found => ActiveRecord :: RecordNotFound最近纔回到Rails。 – Axiombadger 2016-04-08 20:03:06

相關問題