2013-02-02 47 views
1

我有這樣的情況上,我需要一些設計建議,也許有點結構定義:Rails的CSV分貝人口

我有一個可以上傳CSV文件,並基於該文件我要的內容的用戶填充數據庫,聽起來很簡單 - 呃!

好吧,到目前爲止好,現在的事情是,這個csv是相當大的,我的意思是它有100多個頭字段(聽起來很瘋狂),誰知道每個文件有多少記錄,但無論如何,到目前爲止,我們有這csv上傳和db人口。但是請等待,這個csv文件需要根據字段(「DIVISION」)進行分類/分類。 Division是一個整數列,根據它的值我需要確定這個csv屬於哪個分區。到目前爲止,我們有以下要求:

=> CSV file uploading 
    => File classification based on div id 
    => record insertion 

此事尚未解決。司本身又分爲兩類:定期和促銷

我有在我爲每種類型的頭樣本。因此,我們還需要確定此csv屬於哪個分區類型,然後開始處理。

=> CSV file uploading 
    => File classification based on div id and headers (counting and matching the headers for div-sub type using some already defined hash of headers for each division) 

所以之後分裂和子類型的文件屬於我需要做的像,存在,然後一些格式檢查等

我想等領域的一些驗證文件,即鑑定用於文件上傳和smarter_csv寶石carrierwave爲CSV處理那麼一些jQuery插件前端文件處理和類似jquery.fileupload插件和一些後臺作業一體化上傳進度做所有的處理,並鍵入背景進行檢查。

我需要這個怎麼我是個新手一些DB設計/結構的幫助。任何幫助非常感謝,:)。

Regards

+0

我的回答有幫助嗎? – Tilo

回答

0

是的,您可以使用smarter_csv導入您的CSV文件。

對於每一行,你會得到一個哈希與100多個鍵/值對,其中鍵是在你的CSV文件頭(後可能的修改)。

爲了簡單起見,讓我們說,在CSV文件中的一列決定要在數據庫中,例如創建哪種紀錄「師」或「類型」

比方說,你試圖爲廣告數據從一個CSV文件上傳到你的數據庫,那麼你需要創建相應的模型。如果您100+列永不更改名稱,那麼它可能是最好的單表繼承(STI)來模擬這一點:

class Ad < ActiveRecord::Base 
... 
end 

class AdRegular < Ad 
end 

class AdPromo < Ad 
end 

在控制器中,你需要做這樣的事情的上傳:

require 'smarter_csv'{:chunk_size => 1}) do |array| 
    row_hash = array.first 
    case row_hash[:type] 
    when 'regular' 
     AdRegular.create(row_hash) 
    when 'promotion' 
     AdPromo.create(row_hash) 
    else 
     puts "ERROR, unexpected :type in CSV file: #{row_hash[:type]}" 
    end 
end 

您還可以創建從字符串row_hash[:type]類名,然後做一個create通話所產生的類

參見:Create Class from String