ダメでしょ!

プログラミングとか怒られた話とか…

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日です。

github.com

機能紹介

使い方はサンプル含め、以下のサイトに記載があります。

Active admin import by Fivell

ざっと機能を確認すると、

  1. 置換(Replacements)
  2. エンコード処理(Encoding handling)
  3. CSVオプション設定(CSV options)
  4. ヘッダー自動付加機能(Ability to prepend CSV headers automatically)
  5. activerecord-import を利用した一括インポート(Bulk import (activerecord-import))
  6. コールバック(Callbacks)
  7. 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 のいいところですが、

  1. エンコード対応
  2. バリデーション対応
  3. トランザクション対応

です。
日本語を扱う上で エンコードは常に問題になりますし、色々と考える必要に迫られます。しかし、特に英語圏で作成された gem はそのような課題にぶつからないのか、けっこう対応できていない gem は多いように感じます。
また、バリデーションに対応しており、バリデートエラーは画面にメッセージが表示されますので、利用者に優しいです。(active_admin_importable は取込がうまく言ったのかどうかがわかりにくかったんですよね。。)
さらに、トランザクション対応していますので、バリデートエラーが発生した場合はすべての取込をロールバックできます。(バリデートエラーが発生したレコード以外は取り込むように設定することもできます。)

日本語で検索するとactive_admin_importable を紹介しているサイトばかりで active_admin_import を紹介しているサイトがなかったので、今まで選択肢に上がってこなかったかもしれませんが、使ってみることをおすすめします。