CSV形式でruby on railsのDBのデータを出力する方法

Ruby on RailsアプリのDBに登録されているデータをCSV形式で出力する方法を説明します。

DBに以下のように定義されている会社リストがあったとします。

create_table "companies", :force => true do |t|
t.integer "code"
t.string "company_name"
t.string "representative_name"
t.string "zip"
t.string "address"
t.string "capital"
t.string "number_of_branches"
t.string "tel"
t.string "fax"
t.string "url"
t.string "email"
t.string "established_year"
t.string "number_of_employees"
t.datetime "created_at"
t.datetime "updated_at"
end

この会社リストの一覧をCSV形式で出力したい場合は以下のようにします。

まず、config/routes.rbに、csvを出力するためのアクションを追加します。
ここでは、actionの名前をcsvとします。

# config/routes.rb

map.resources :companies, :collection => {:csv => :get}

次に、app/controllers/companies_controller.rbに、csvというアクションを追加します。
以下のようになります。

# app/controllers/companies_controller.rb

require 'csv'

def csv
CSV::Writer.generate(output = "") do |csv|
Company.find(:all).each do |company|
csv << [company.id, company.company_name, company.zip, company.address, company.email, company.url, company.representative_name, company.capital, company.number_of_branches, company.tel, company.fax, company.established_year, company.number_of_employees]
end
end
send_data(output,
:type => 'text/csv',
:filename => "companies_#{Time.now.strftime('%Y_%m_%d_%H_%M_%S')}.csv")
end

viewのどこか(この例では、index.html.erbとします)に、アクションを呼び出すためのリンクを設置します。

# app/views/index.html.erb

<%= link_to "Output as CSV", csv_companies_path %>

これで、Output as CSVというリンクをクリックすると、companies_2010_02_22_18_22_47.csvという名前のcsvファイルが出力されます(ファイル名のタイムスタンプは、実行した時刻によって変化します)。