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