railsã«CSVå½¢å¼ã§ã®ãã¦ã³ãã¼ãæ©è½ã追å ãã
èæ¯
webã¢ããªã±ã¼ã·ã§ã³ã®ä½ææã«ããä¸è¦§ãã¼ã¿ãExcelã§éããããã¨ããè¦æããã伺ãã¾ãã
ããã§æ¬è¨äºã§ã¯railsã¢ããªã«ãã¼ã¿ã®ä¸è¦§ãcsvå½¢å¼ã§ãã¦ã³ãã¼ãåºæ¥ãæ©è½ã追å ããæ¹æ³ã«ã¤ãã¦è§£èª¬ãã¾ãã
ã¢ãã«ã®å¤æ´
ã¾ãã¯ã¢ãã«ã«CSVå½¢å¼ã®ãã¼ã¿ãè¿å´ããã¡ã½ãããå®ç¾©ãã¾ãã
ä»åã¯ä¾ã¨ãã¦åå(Item)ã¢ãã«ãæ±ããååã¢ãã«ã¯åååã¨ä¾¡æ ¼ã®ã«ã©ã ãæã¤ã¨ãããã¨ã«ãã¾ãã
CSVãã¡ã¤ã«ãæ±ãã«ã¯ãæ¨æºã®CSVããã±ã¼ã¸ã使ãã®ãç°¡åã§ãã
ãã¡ã¤ã«ãµã¤ãºã巨大ï¼ä¾ãã° 100Mãã¤ã以ä¸ï¼ã§ç¡ããã°æ§è½çã«ãåé¡ãªãã§ãããã
require 'csv'
class Item < ActiveRecord::Base
def self.to_csv
headers = %w(ID ååå ä¾¡æ ¼ ä½ææ¥æ æ´æ°æ¥æ)
csv_data = CSV.generate(headers: headers, write_headers: true, force_quotes: true) do |csv|
all.each do |row|
csv << row.attributes.values_at(*self.column_names)
end
end
csv_data.encode(Encoding::SJIS)
end
end
CSVçææã®ãªãã·ã§ã³ã¨ãã¦ãheaders
ããã³write_headers
ã§ãããã¼è¡æ¸ãè¾¼ã¿ããforce_quotes
ã§å
¨ã¦ã®ãã£ã¼ã«ãã®ä½ææã«ã¯ãªã¼ãã追å ãããã¨ãæå®ãã¦ãã¾ãã
ã¾ããExcelã§éããã¨ãæ³å®ãã¦#encode
ã¡ã½ããã§Shift JISã®æåã³ã¼ããæå®ãã¦ãã¾ãã
ã³ã³ããã¼ã©ã¼ã«formatæå®ã追å
次ã«ã³ã³ããã¼ã©ã¼ã«CSVå½¢å¼ã§ã®è¿å´æå®ã追å ãã¾ã
class ItemsController < ApplicationController
def index
@items = Item.all
respond_to do |format|
format.html
format.csv { send_data Item.to_csv, type: 'text/csv; charset=shift_jis', filename: "items.csv" }
end
end
respond_to
ãããã¯å
é¨ã«format.csv
ã追å ãããã¨ã§ãã¢ãã¬ã¹æ«å°¾ã«.csv
ãæå®ãããã¨ãï¼ä¾ãã°localhost:3000/items.csv
ï¼ã®åä½ãè¦å®ãã¾ãã
CSVå½¢å¼ãæå®ããå ´åã¯ç´æ¥ãã¦ã³ãã¼ãããããã®ã§ãsend_data
ãç¨ãã¦ãã¾ãã
ãã¥ã¼ã«ãã¦ã³ãã¼ãã®ãªã³ã¯ãå¼µã
æå¾ã«ãã¦ã³ãã¼ãç¨ã®ãªã³ã¯ãç¨æãã¾ãã
= link_to 'CSVå½¢å¼ã§ãã¦ã³ãã¼ã', items_path(format: 'csv')
ã³ã³ããã¼ã©ã¼ã®index
ã¡ã½ããã«csvã§ã®è¿å´ã追å ããã®ã§items_path
ãæå®ããããã«format: 'csv'
ãæ¸¡ããã¨ã§ã¢ãã¬ã¹æ«å°¾ã«.csv
ãæå®ããå ´åã¨åãåä½ãããã¦ãã¾ãã