seedデータってどうやって入れる?seed-fuを使った便利なSeedデータ挿入法

railsアプリの初期データを入れ方として初期段階ではrake db:seedがあります。 でも、繰り返し使った場合同じデータが登録されたり、登録するデータの選別が出来ません。(コメントアウトを使えば出来るけどめんどくさくてやってられない) ここでseed-fuを使えば、未登録のデータだけ登録したり開発環境と本番環境のデータを分ける事も可能です。

f:id:t1gerk1ngd0m:20190823223750g:plain

インストール

rails5.0系以上では2.3を使います。

Gemfile

gem 'seed-fu', '~> 2.3'

ディレクトリ配置

seed_fuではdb直下にfixturesディレクトリを作成し、その下にseedファイル、もしくはディレクトリを配置します。 例えば開発環境と本番環境でのseedファイルを分けたい場合、下記の様に環境ごとにseedファイルを分ける事が出来ます。

db
  ├ fixtures
    ├ development
      ├ ○○.rb
      ├ ○○.rb
    ├ production
      ├ ○○.rb
      ├ ○○.rb
  ├ migrate

ファイルの実行

seedファイルが用意出来たと想定し、ファイルを実行しseedデータを入れていきます。(seedファイルの書き方は後述) rakeタスク実行時、FIXTURE_PATHオプションを付与する事でseedファイルを読み込むパスを指定できます。 また、FILTERオプションを付与する事でseedファイルを指定する事も出来ます。

# 通常の実行
rake db:seed_fu

# ファイルパスを指定する場合
rake db:seed_fu FIXTURE_PATH=path/to/fixtures

# seedファイルを指定する場合
rake db:seed_fu FILTER=users,articles  # 複数指定する場合はカンマ区切り

seedファイルの記述の仕方

seedファイルの書き方は下記のようになる。下記を実行するとデータが1つ挿入される。

db/fixtures/user.rb

User.seed do |s|
  s.name = "田中健太郎"
  s.email = "aaa@gmail.com"
  s.password = "123456"
end

しかし、実際は大量のデータを扱う事になるので、下記のように記述する事が多いかもしれない。 下記を実行するとデータが10個挿入される。

db/fixtures/user.rb

10.times do |n|
  User.seed do |s|
    s.name = "テスト名前#{n}"
    s.email = "aaa#{n}@gmail.com"
    s.password = "123456"
  end
end

seedデータ実行順

seedデータは上から順に実行されるので、モデルをネストさせている場合ファイル名通りに読み込まれ途中でエラーを吐く可能性がある。 そこで、一番上のモデルからファイル名の頭にナンバリングしておくと良い。

db
  ├ fixtures
    ├ 01_user.rb
    ├ 02_group.rb
    ├ 03_task.rb
  ├ migrate

こうする事で、ナンバリングされた順でファイルが読み込まれるため関連付けされていない事によるエラーが起こらない。