[Rails] seed-fu を使って初期データを作成する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Rails で初期データ作成を便利にする Gem 「seed-fu」 を紹介します。
プロジェクトへの導入の手順、seed データの登録の順で紹介していきます。

導入の手順

インストール

Gemfile に以下を追記し、 bundle install します。

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

※ Rails 3.1, 3.2, 4.0, 4.1, 4.2, 5.0 の場合、'~> 2.3' を指定。

ディレクトリの作成

seed-fu のデフォルトは、下記ディレクトリ配下にある seedファイルを読みます。

  • #{Rails.root}/db/fixtures
  • #{Rails.root}/db/fixtures/#{Rails.env}

環境毎に初期データが異なる場合、seedファイルを分けておけば環境毎に読み込んでくれます。

seed ファイルの作成

#{Rails.root}/db/fixtures/users.rb という名前で Userモデル用の seedファイルを作成します。

User.seed(:id) do |s|
  s.id = 1
  s.name = "jon"
end

User.seed(:id) do |s|
  s.id = 2
  s.name = "emily"
end

以上の記述を行うことにより、idに該当するレコードが存在しなければ、レコードを新規作成します。
idに該当するレコードが存在すれば、レコードを更新します。

1度のみ実行したい時

1度のみ実行したい場合は、seed_onceを利用します。

User.seed_once(:id) do |s|
  s.id = 1
  s.name = "jon"
end

id以外が主キーの時

id以外が主キーの時は、以下の:emailのように主キーを指定します。

User.seed(:email) do |s|
  s.email = "jon@example.com"
  s.name = "jon"
end

たくさんのデータを作成したい時

以下のようなシンタックスシュガーが用意されています。

User.seed(:id,
  { :id => 1, :name => "Jon"   },
  { :id => 2, :name => "Emily" }
)

seed データの登録

下記コマンドでseedデータをDBに登録します。

rake db:seed_fu

rakeタスク実行時にファイルパスを指定する

rakeタスク実行時にFIXTURE_PATHオプションを付与する事で、seedファイルの読むファイルパスを指定する事ができます。

rake db:seed_fu FIXTURE_PATH=path/to/fixtures

rakeタスク実行時にフィルタを指定する

rakeタスク実行時にFILTERオプションを付与する事で、実行する seedファイルを指定する事ができます。指定方法はファイル名のカンマ区切りです。

rake db:seed_fu FILTER=users,articles

まとめ

以上の手順によって、 seed-fu を使って初期データの管理ができるようになりました。
とても便利なので、是非あなたの Rails プロジェクトに導入しましょう!