ActiveAdmin にCSV取込機能を追加する際に便利な gem active_admin_import
前提
ruby 2.1.10p492
Rails 4.2.8
active_admin_import
既存システムの修正依頼
前に他の担当者が作成した Rails アプリで、CSVインポートが上手くいかないという相談があり、アプリを確認したところ、管理サイト側が ActiveAdmin を利用していました。
そして、CSVインポート機能として採用されていたのは active_admin_importable という gem でした。
この gem なんですが、最新バージョンの更新日が2013年4月30日で、約4年更新がありません。
枯れているという意味ではいいのかもしれませんが、既存のソースを確認してみるとモンキーパッチを当てている箇所があったり、Shift-JIS の取込で苦労していそうな感じでした。
なので、別の gem を探してみたところ、今回利用した active_admin_import がいい感じでした。
調査時点での最新バージョンの更新日付は2017年4月26日です。
機能紹介
使い方はサンプル含め、以下のサイトに記載があります。
ざっと機能を確認すると、
- 置換(Replacements)
- エンコード処理(Encoding handling)
- CSVオプション設定(CSV options)
- ヘッダー自動付加機能(Ability to prepend CSV headers automatically)
- activerecord-import を利用した一括インポート(Bulk import (activerecord-import))
- コールバック(Callbacks)
- Zipファイル取込(Zip files)
と、なかなか便利な感じです。
使ってみる
gem 'active_admin_import' # ActiveAdmin用CSVインポート機能
上記を Gemfile に記載し、bundle install
します。
この gem は active_admin 用ですので、 app/admin/モデル名.rb
ファイルに追記していくことになります。
以下は User モデルへの追加例です。
# app/admin/user.rb ActiveAdmin.register User do active_admin_import validate: true, batch_transaction: true, template_object: ActiveAdminImport::Model.new( hint: "インポートするCSVファイルにヘッダー行は必要ありません。<br> 文字コードは CP932(Windows-31J) を想定しています。(Excelを元にしたCSVファイルを想定)<br> <br> 以下の順序で設定されているファイルを取り込みます:<br> 'ID', 'パスワード', '姓', '名', '所属'<br> <br> 取込に失敗した場合のエラーは5件分のみ表示しています。", csv_headers: ['user_id', 'password', 'last_name', 'first_name', 'dept'], force_encoding: :'CP932' )
上記のように記載するだけで、ヘッダー行なしのエクセルベースで作成したCSVファイルを取り込むことができるようになりました!
使ってみての利点
こちらの gem のいいところですが、
です。
日本語を扱う上で エンコードは常に問題になりますし、色々と考える必要に迫られます。しかし、特に英語圏で作成された gem はそのような課題にぶつからないのか、けっこう対応できていない gem は多いように感じます。
また、バリデーションに対応しており、バリデートエラーは画面にメッセージが表示されますので、利用者に優しいです。(active_admin_importable は取込がうまく言ったのかどうかがわかりにくかったんですよね。。)
さらに、トランザクション対応していますので、バリデートエラーが発生した場合はすべての取込をロールバックできます。(バリデートエラーが発生したレコード以外は取り込むように設定することもできます。)
日本語で検索するとactive_admin_importable を紹介しているサイトばかりで active_admin_import を紹介しているサイトがなかったので、今まで選択肢に上がってこなかったかもしれませんが、使ってみることをおすすめします。