Step by Step Ruby on Rails

Ruby on Railsで実際にWebサイトを構築する手順をまとめています。

Active Adminのcsvインポートでバリデーションチェック

Active Adminのcsvインポートでは、Railsのモデルでのバリデーションやデータベースで一意性制約の設定を行っていると、重複データのあるCSVファイルインポート時にバリデーションエラーで異常終了してしまいました。
 
MySQLの"LOAD DATA LOCAL INFILE"のコマンドを使ってCSVファイルをインポートする場合は、デフォルトで"IGNORE"オプションが指定されていて、スキップしてくれていたので同じような事が出来ると思っていたのですが、Active Adminのcsvインポートでは同じようなオプションの設定は見つかりませんでした。
 
●active_admin_importableをカスタマイズ
 
active_admin_importableのデータ登録時の挙動をカスタマイズする事によってバリデーションチェックエラーのデータはスキップするように設定してみました。
 
以下、Railsのモデルでバリデーションを定義済みのMarkerモデルに対する設定例です。
 
下記のように各レコードをインポートする前に"valid?"メソッドを実行し、バリデーションチェックがOKの場合はデータベースに登録し、バリデーションチェックがNGの場合はログ記録のみ行い、スキップして継続します。
 
$ vi app/admin/marker.rb

ActiveAdmin.register Marker do
   active_admin_importable do |model, hash|
     store = model.new(hash)
     if store.valid?
       model.create(hash)
     else
       Rails.logger.warn(store.errors.inspect)
     end
   end
end