RailsでCSVのインポート、エクスポートを行う場合はRubyのcsvライブラリを使う必要があります。
csvライブラリの事前準備
config/application.rb
下記のrequire文を追加しましょう。
1 |
require 'csv' |
Railsを再起動します。
エクスポート機能の実装
モデルクラス側
モデルクラス(app/models/モデル名.rb)の中でモデルのデータを取得してCSV文字列を返すようにします。allメソッドとかで全レコードを取得したりすると良いでしょう。
CSV.generateメソッド
CSV文字列を生成するメソッドです。
コントローラー側
下記のような記述をして該当URLにcsv形式で指定された場合のみcsvファイルをエクスポートするような設定にしましょう。
1 2 3 4 |
respond_to do |format| format.html format.csv { send_data @モデル名.csv生成メソッド名, filename: "csvファイル名-#{Time.zone.now.strftime('%Y%m%d%S')}.csv" } end |
なお、HTMLでアクセスされた場合はformat.htmlが動作し通常のHTMLページが返ります。
ビュー側
1 |
= link_to '出力', 「format: :csv」を指定したURL |
エクスポート機能を実装したURL画面を「format:csv」により呼び出しましょう。するとCSV出力が自動で行われます。
インポート機能の実装
モデルクラス
モデルクラスに下記のようなメソッドを実装します。
1 2 3 4 5 6 7 |
def self.import(file) CSV.foreach(file.path, headers: true) do |row| モデルインスタンス名 = new モデルインスタンス名.attributes = row.to_hash.slice(*csv_attributes) モデルインスタンス名.save! end end |
file
アップロードされたCSVファイル内容のオブジェクトです。ファイル内容にアクセスできます。
CSV.foreach
CSVファイルから1行ずつ読み込みます。「headers: true」により1行目をヘッダ行として無視できます。
モデルインスタンス名.attributes
モデルインスタンの各属性にcsv一行の情報を加工して入れ込みます。
to_hashメソッドとsliceメソッド
to_hashメソッドでCSVのデータをハッシュの形({キー =>"値"})に整形します。sliceメソッドで本来インプットするつもりがなかった属性については排除をしています。
モデルインスタンス名.save!
モデルインスタンスをDBに登録します。
コントローラー側
モデルクラス側で作ったimportメソッドを呼び出しましょう。その際は「params[:file]」等でパラメータとしてCSVファイルのオブジェクトを渡しましょう。
この記事へのコメントはありません。