RAILS 4 : TSV, CSV から SEED データ を入れる


Rails 4 : TSV から seed データ を入れる では TSV のみ使用可能でしたが、 今回は TSV のみならず、 CSV も利用可能です。

簡単にいうと、 TSV クラス に加えて CSV クラス も作ったということです。

環境

  • Ubuntu 14.04 LTS
  • Rails 4.1.8
  • Ruby 2.2.2

使い方

使い方は前の記事に書いたのとほぼ同じです。

説明

rake seed_file:load TSV=aaa,bbb,ccc/dddaaa.tsvbbb.tsvccc/ddd.tsv をこの順で取り込みます。 特別処理をするコードを書いていない場合は クラス AaaBbbCcc::Ddd が必要になります。

rake seed_file:load を実行しても db/seeds/xsv の下のすべての TSV を取り込むようにはなっていません。 進行中だったプロジェクトにおいて必要性を感じなかったので実装しませんでした。

注意

  • TSV, CSVdb/seeds/xsv ディレクトリ の下に モデル名のスネークケース + “.tsv” の形で配置されるものとします。
  • TSV, CSV は 1行目をカラム名、2行目以降を値にします。 存在しないカラムが記述されている場合、そのカラムはデータベースに取り込まれません。 _memo という存在しない名前のカラムを作って、備考として利用することも可能です。
  • 一度取り込んだ id は変更しないこと。 id をもとに データ の新規作成・更新を行っているので、 id が変更されると意図せぬデータができます。
  • 取り込んだデータは後から削除できません。

プログラム

まずはタスクファイルを作成します。.

TSV オブジェクト を作成し、 1行ずつ読み込みます。 一度にすべてをメモリに読み込まないので、大きなファイルでも対応可能です。 ruby では require 'csv' とすることで TSV も扱える CSV クラス が使えるようになるのですが、 カラムと値のハッシュを取得したかったり、 TSV や CSV の処理をメイン処理内に書きたくなかったりで、 TSV, CSV クラス を作る運びとなりました。

Task Code

"dir/file.csv" というファイルを読み込む際には Dir::File をモデルクラスとして使用するようになっています。

seed.rb からタスクを呼び出すようにすれば、 rake db:seed 実行時にもデータが取り込まれるようになります。

seed.rb

処理内容の説明が必要な場合は Rails 4 : TSV から seed データ を入れる をご参照ください。