baronyan's blog

linux,macでruby、railsでの開発をしていく中で知ったこと、備忘的なことなどを書いていきます。

ActiveAdminをカスタマイズしてDBレコードのcsv書き出しと取り込みを簡単にできるようにしてみました。

Railsアプリの管理画面を簡単に作成できるActiveAdminというgemがあります。
このgemはかなり便利で、crud操作はもちろんのこと、便利な検索(Filter)や、
csvxmljsonでのダウンロード機能も提供してくれます。

さらにactive_admin_importableというgemをインストールすれば、
csvをアップロードすることでDBにレコードを追加することができます。

csv書き出しとcsv取り込み、この2つがあれば、
エンジニアではない人による管理業務など色々と便利になりますよね。

ところがデフォルトのcsvダウンロードだと外部キーがヘッダに含まれないという
仕様になっているようで、ダウンロードしたcsvをDBに(同一スキーマの他環境DBに、
または、レストアとして同DBに)読み込ませることはできません。

そこで、外部キーも含めた全カラムの情報がcsvに含まれるようにカスタマイズしてみました。

Rails_root/app/admin/モデル.rb
という形でモデルの管理ページを記述するのですが、
このファイルに次のように追記します。

追記前

	ActiveAdmin.register Book do
	index do |books|
	    ...
	  end
	  
	  show do |book|
	    ...
	  end
	end

追記後

	ActiveAdmin.register Book do
	  csv :force_quotes => false do
	    Book.column_names.each do |col|
	      column col.to_sym
	    end
	  end
	  
	  index do |books|
	    ...
	  end
	  
	  show do |book|
	    ...
	  end
	end

これで無事、Bookテーブルの全カラムを含んだcsvをダウンロードできるようになりました。
(ただし、ヘッダ内の外部キー名からは「_id」が強制的に削除される仕様のようです。)



次にcsv読み込みです。
active_admin_importableの基本的な使い方としては、
csv書き出し同様、Rails_root/app/admin/モデル.rb に次のように追記します。

	active_admin_importable do |model, hash|
	  arg = {}
	  Book.column_names.each do |col|
	    col_sym =  col.to_sym
	    arg[col_sym] = hash[col_sym]
	  end
	  model.create(arg)
	end

上で書いたように、書き出したcsvはヘッダの外部キー名から「_id」が消えている状態ですが、
次のようにすることでその差異を吸収できます。

	active_admin_importable do |model, hash|
	  arg = {}
	  Book.column_names.each do |col|
	    col_sym =  col.to_sym
	    col = col.gsub('_id', '')
	    col_sym_for_hash =  col.to_sym
	    arg[col_sym] = hash[col_sym_for_hash]
	  end
	  model.create(arg)
	end


以上がactive_adminとactive_admin_importableを用いた
DBレコードのcsv書き出しと読み込みの方法です。


かなり便利だと思います。是非使ってみてください!


追記:
csv書き出しは管理画面の左下に「csv」表記のリンクで表示されます。
csv読み込みは管理画面の右上に「Import モデル名s」表記のボタンで表示されます。