Faster CSV:レポートの手伝い


FasterCSVはRubyの中のCSVファイルを処理するlibである.その名の通り、彼はCSVの処理速度がRuby standard Libより速い.ここではActive Recordを連結してレポートを生成し、管理者に毎日1部のEmailレポートを送る方法を紹介します.本編の参考
How to email reports from Rails .
インストール
gem i fastercsv
インストールが完了しましたので、プログラムで使用するにはrequireを先に
require 'rubygems'
require 'faster_csv'
Active Recordに接続し、レポートを生成
Userリポジトリの中身をCSVファイルにしたいと仮定します
FasterCSV.open("report.csv", "w") do |csv|
fields = User.content_columns.inject([]) do |result,column|
result << column.name
end
csv << fields.map {|f| f.titleize }
User.find_all.each do |row|
csv << fields.map {|f| row[f] }
end
end
ここでcsv<<は1回のプラグを1行挿入することを意味し,まだできていない場合は1つのArrayで一時保存する.最後にcsv<How to email reports from Railsの例を直接使います.
class Notifier < ActionMailer::Base
def sales_for_yesterday
require 'FasterCSV'

@from = 'someone@example.com'
@recipients = 'someone@example.com'
@sent_on = Time.now
@yesterday = 1.day.ago
@body = { :yesterday => @yesterday }
@subject = "Sales Report"

attachment :content_type => "text/csv", :filename => "sales_#{@yesterday.to_date}.csv" do |a|
a.body = FasterCSV.generate do |csv|
csv < < (fields = ["artist", "product", "variant", "unit price", "qty sold", "total"]).map {|f| f.titleize }
Report.sales_for_date(@yesterday).each do |row|
csv << fields.map {|f| row[f] }
end
end
end
end
end
このセクションは、ファイルが添付されていることを意味し、a.body assignは、生成されたばかりのCSV Objectに
attachment :content_type => "text/csv", :filename => "file_name.csv" do |a|
a.body = FasterCSV.generate do |csv|
# code
end
end
から真ん中に、作成したばかりのActive Recordに接続されたcodeを記入すればよい.毎日Emailレポートを送るには、Crontab+RailsのRunnerを使ってください.