2017-02-24 48 views
0

我編寫了Ruby代碼來運行連接到API並輸出一個報表的查詢。當我通過終端在本地運行它時,它將結果保存爲CSV文件。我想配置我的Rails應用程序來執行相同的操作,將輸出保存爲列或創建文件下載。要做到這一點,最好的方法是什麼?由於文件沒有列類型,我應該使用CSV做一個字符串嗎?在Rails中運行查詢,如何將結果(csv)保存爲列?

目前我做了以下內容來創建CSV:

CSV.open("LOCATION/FILENAME") do |csv| 
FIELDS 
csv << [FIELD NAMES] 
end 

回答

0

我想了很長一段時間,然後才意識到,我應該CSV數據保存爲哈希值的數組。在遷移中,我使用t.json :array_of_hashes, default: []作爲表,因爲數組不是有效的字段類型。 接下來,我將使用this建議將數組呈現爲顯示視圖頁面上的表格,以及J.P.建議將表格呈現爲CSV格式以供下載。

0

您可以通過創建自己的「渲染」,其中典型的請求與響應的HTML在您的控制器爲您的CSV請求作出迴應或JSON,你也可以讓你的控制器用PDF格式對你的請求做出迴應,或者像你的情況一樣使用CSV格式,下面是一些合理的文檔:http://api.rubyonrails.org/classes/ActionController/Renderers.html

總之,你可以做這樣的事情(從文檔):

創建CSV渲染:我們用啞劇的CSV MIME類型

ActionController::Renderers.add :csv do |obj, options| 
    filename = options[:filename] || 'data' 
    str = obj.respond_to?(:to_csv) ? obj.to_csv : obj.to_s 
    send_data str, type: Mime[:csv], 
    disposition: "attachment; filename=#{filename}.csv" 
end 

注意,因爲它涉及使用Rails 。對於自定義渲染器,您需要使用Mime::Type.register註冊MIME類型。

要在控制器動作使用CSV渲染器:

def show 
    @csvable = Csvable.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.csv { render csv: @csvable, filename: @csvable.name } 
    end 
end 
+0

@SkunkDog,我的回答對你有幫助嗎?如果是的話,你可以標記它是正確的? :) –

+1

我還沒有機會測試這個,我今天下午會證實。 – SkunkDog

+0

對不起,我花了一段時間才把頭繞過來。我認爲你所描述的將允許我基本下載顯示頁面作爲CSV,對吧?但是,我正在運行一個生成大型數據表的API調用。我希望將此調用的結果作爲CSV下載。由於每個表中有很多條目(比如1000+),我不想將每個條目保存爲自己的數據庫條目。我如何允許下載表格? – SkunkDog