テストデータの投入にはシードを使おう。

 

突然ですが、Railsで開発を行う際のデータってどのように作成してますでしょうか?

手で都度入力してデータを作っている、SQLを書いてデータを作成している。などであればすぐにRailsのseedの機能を活用するのをオススメします。

 

Railsのseedとは?

 

アプリケーション開発時のデフォルトのデータを作成するための仕組みです。投入したいデータをあらかじめdb/seed.rbに書いておいてコマンドを実行するだけでテストデータを作成することができます。

例えばシードデータとしてあらかじめユーザーを作成したい場合はdb/seed.rbに以下のように記述しておきます。

users = [
  { name: 'taro', age: 20, tall: 173 },
  { name: 'jiro', age: 18, tall: 185 },
  { name: 'saburo', age: 16, tall: 165 }
]
ActiveRecord::Base.transaction do
  users.each do |user|
    User.create!(user)
  end
end

あとは、これを下記コマンドで実行すれば開発に入る前にユーザーデータを作成することができます。

rails db:seed

現場で行われているであろう運用

 

これは僕自身の観測範囲内ではあるのですが、ちゃんとした現場では、

あらかじめシードデータを作成してデータベース作成、マイグレーションの後にrails db:seedでデータを投入する。

  1. あらかじめシードデータを作成しておく
  2. マイグレーションの後にrails db:seedでデータ投入
  3. テーブルを追加したり、変更を加えるタイミングでシードデータも変更
という運用にされています。

現場によっては、SQLダンプを開発環境や本番環境(もちろん個人情報などのデータはマスキングして)から取得してみたいなところもあるかと思いますが、これはあまりオススメできる方法ではありません。

本番のデータなどは平気で10GBなどのデータ量になるので取得してくるだけで時間もかかるし、不要にでかいデータで自分のPCの容量を逼迫させるだけです。PCを買い換えたり、PCが故障したり誤ってデータを消してしまったりしただけで、その都度長い時間をかけてデータを入れ直す作業が発生します。

シードデータでは本当に必要なデータだけがDBに入っている状態になるので、上記のようなことはありませんし、カジュアルにDBを入れたり消したりできるようになるのでプライマリーキーのシーケンスだったり、外部キーだったりを気にせずにちょっとデータをいじって動作確認をするなんかもやりやすくなります。

また毎回手でテストデータを作り直すというのも論外なので積極的にシードデータを活用して気持ちよく開発ができる環境を作っていきましょう。

 

シードファイルを分割する。

 

先ほどの実際にシードデータを投入する例では、シードデータの投入処理をdb/seeds.rbに直接書いていましたがこれだとシードデータが増えた時に大変汗。という場合があるので、ファイルを分割する方法も紹介しておきます。

db/seedsを以下のようにしておくとdb/seeds配下のシードファイルをひとつずつ実行してくれるようになります。

# db/seeds/以下のファイルを読み込み
development_seed_files = Dir[ Rails.root.join('db', 'seeds', '*.rb') ].sort

ActiveRecord::Base.transaction do
  # 読み込んだファイルをループ
  development_seed_files.each do |file|
    puts "execute #{File.basename(file)} seed"
    # ファイルを読み込むと同時に実行
    load(file)
  end
end

 

まとめ

 

今回はシードデータについて書きましたが、シードデータ自体は知ってしまえば難しいものではないのですが今回現場での運用みたいなところも かけたので、こういう情報もすこしずつサイトに載っけられると良いかなと思いました。きれいなコードをかけたり、素早くコードをかけたりするのも大事ですがこういった環境整備も地味に普段の仕事に効いてくるの少しずつ身につけられるとよいですね。