2017-02-24 3 views
0

私はAPIに接続してレポを出力するクエリを実行するためにRubyコードを書いていました。ターミナル経由でローカルに実行すると、結果がCSVファイルとして保存されます。私は同じように、出力を列として保存するか、ファイルのダウンロードを作成する私のRailsアプリケーションを構成したいと思います。これを行う最善の方法は何ですか?ファイルの列型がないので、CSVを使用して文字列を作成する必要がありますか?Railsでクエリを実行し、結果(csv)を列として保存する方法は?

現在、私はCSVを作成するには、次のをやってる:

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

答えて

0

私はかなりの時間のためにこれについて考え、そして私は、ハッシュの配列としてCSVデータを保存する必要があることに気づきました。移行では、arrayは有効なフィールド型ではないので、テーブルにt.json :array_of_hashes, default: []を使用しました。 次に、this提案を使用して、ビューを表示ページでテーブルとしてレンダリングし、テーブルをダウンロードするCSVとしてレンダリングする提案をします。

0

あなたはあなたの典型的な要求はHTMLで応答や場所、あなた自身の「レンダラ」を作成することによって、あなたのコントローラであなたのCSVの要求に応答することができますJSONでは、あなたのコントローラがPDFでリクエストに応答したり、CSVのように応答したりすることができます。ここにいくつかの合理的なドキュメントがあります:http://api.rubyonrails.org/classes/ActionController/Renderers.html。それはRailsのが付属していて、我々はCSV形式のMIMEタイプの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 

注:

は、CSVレンダラーを作成します。要するに

は、あなたが(ドキュメントから)このような何かを行うことができます。カスタムレンダラーの場合は、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

関連する問題