今回は初期データの追加や管理が楽にできるseed_fuの使い方についてまとめてみました。これまでの実装では「初期データ = seeds.rb」と無意識にseeds.rbを使っていましたが、これからの実装では個人的には「初期データ = seed_fu」となりそうです。
seed_fuとは
seed_fuとは、初期データを作成・管理することができるgemになります。
初期データの作成ではseeds.rbが有名ですが、seeds.rbに初期データを入れた場合、「% rails db:seed」を実行する度に同じデータが作成されてしまうため、その度にデータを一度削除しなければならないというデメリットがあります。
一方seed_fuでは、seedデータに変更を加えた場合でも同じデータを作成することなく変更のみを反映する仕様になっているため、seeds.rbで管理するよりも簡単にデータの変更が可能になります。
seed_fuの使用手順
seed_fuを使用するまでの流れは以下のようになります。
- seed_fuのインストール
- 環境毎のディレクトリを作成
- 初期データの投入
- 「% rails db:seed_fu」コマンドの実行
1. seed_fuのインストール
Gemfileに以下を追記し、bundle installを実行します。
gem 'seed-fu'
% bundle install
2. 環境毎のディレクトリを作成
以下のコマンドを打ち込み、development環境とproduction環境のディレクトリを作成します。ここに初期データを投入していく形になります。
% mkdir db/fixtures
% mkdir db/fixtures/development
% mkdir db/fixtures/production
3. 初期データの投入
続いて実際に初期データを投入してみます。
今回はdevelopment環境にUserモデルの初期データを投入します。
まずは以下のコマンドを打ち込み「01_user.rb」を作成しましょう。
% touch db/fixtures/development/01_user.rb
先ほど作成したファイルに以下の記述を追記します。
User.seed do |s|
s.id = 1
s.email = 'hoge@example.com'
s.password = 'Hoge1234!'
s.name = '田中太郎'
s.name_kana = 'タナカタロウ'
s.phone_number = '09011112222'
end
4. 「% rails db:seed_fu」コマンドの実行
初期データの投入が完了後、seed_fuの実行コマンドを打ち込みDBに反映させましょう。
% rails db:seed_fu
== Seed from /db/fixtures/development/01_user.rb
- User {:id=>1, :email=>"hoge@example.com", :password=>"Hoge1234!", :name=>"田中太郎", :name_kana=>"タナカタロウ", :phone_number=>"09011112222"}
では先ほどの初期データに変更を加えてみます。
「01_user.rb」を以下のように編集し、再度seed_fuの実行コマンドを打ち込みました。
User.seed do |s|
s.id = 1
s.email = 'hoge@example.com'
s.password = 'Hoge1234!'
s.name = '田中太郎'
s.name_kana = 'タナカタロウ'
s.phone_number = '09011112222'
end
User.seed do |s|
s.id = 2
s.email = 'hogehoge@example.com'
s.password = 'HogeHoge1234!'
s.name = '田中二郎'
s.name_kana = 'タナカジロウ'
s.phone_number = '08011112222'
end
% rails db:seed_fu
== Seed from /db/fixtures/development/01_user.rb
- User {:id=>1, :email=>"hoge@example.com", :password=>"Hoge1234!", :name=>"田中太郎", :name_kana=>"タナカタロウ", :phone_number=>"09011112222"}
- User {:id=>2, :email=>"hogehoge@example.com", :password=>"HogeHoge1234!", :name=>"田中二郎", :name_kana=>"タナカジロウ", :phone_number=>"08011112222"}
2つのデータのみ更新されていますね。このようにseed_fuの場合は、既存のデータを一度も削除することなくデータの変更・更新が可能になります。
シンタックスシュガーでも記述可能
seed_fuでは前述したようなseedファイルの書き方以外にも、これまでのseeds.rbの書き方同様、シンタックスシュガーを用いることも可能です。
User.seed(:id, [
{ id: 1, email: 'hoge@example.com', password: 'Hoge1234!', name: '田中太郎', name_kana: 'タナカタロウ', phone_number: '09011112222' },
{ id: 2, email: 'hogehoge@example.com', password: 'HogeHoge1234!', name: '田中二郎', name_kana: 'タナカジロウ', phone_number: '08011112222' },
])
% rails db:seed_fu
== Seed from /db/fixtures/development/01_user.rb
- User {:id=>1, :email=>"hoge@example.com", :password=>"Hoge1234!", :name=>"田中太郎", :name_kana=>"タナカタロウ", :phone_number=>"09011112222"}
- User {:id=>2, :email=>"hogehoge@example.com", :password=>"HogeHoge1234!", :name=>"田中二郎", :name_kana=>"タナカジロウ", :phone_number=>"08011112222"}
データの固定も可能
一度作成したデータを変更しない場合は、seed_onceを使うことでそれらのデータを固定することができます。
User.seed_once do |s|
s.id = 1
s.email = 'hoge@example.com'
s.password = 'Hoge1234!'
s.name = '田中太郎'
s.name_kana = 'タナカタロウ'
s.phone_number = '09011112222'
end
% rails db:seed_fu
== Seed from /db/fixtures/development/01_user.rb
まとめ
- seed_fuとは、初期データを作成・管理することができるgem
- seed_fuでは、seedデータに変更を加えた場合でも同じデータを作成することなく変更のみを反映する仕様になっているため、seeds.rbで管理するよりも楽にデータの変更が可能
- ファイル名の先頭に番号を振ることで、実行するseedデータの順番を制御することが可能
- シンタックスシュガーでも記述可能
- seed_onceを用いることでデータの固定も可能
参考
今回はseed_fuを用いた初期データの投入方法について解説しました。seed_fuを用いることで、初期データの追加や管理がかなり便利になります。seeds.rbで初期データを管理しているアプリケーションがあればseed_fuに移行してみてはいかがでしょうか。