Rails

【Rails】初期データの追加や管理が楽にできるseed_fuの使い方についてまとめてみた

Rails

 

今回は初期データの追加や管理が楽にできる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を使用するまでの流れは以下のようになります。

  1. seed_fuのインストール
  2. 環境毎のディレクトリを作成
  3. 初期データの投入
  4. 「% 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
実行するseedデータの順番を制御するため、ファイル名の先頭に番号を振ることに注意しましょう。

 

先ほど作成したファイルに以下の記述を追記します。

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を用いることでデータの固定も可能

参考

mbleigh/seed-fu

 

 

今回はseed_fuを用いた初期データの投入方法について解説しました。seed_fuを用いることで、初期データの追加や管理がかなり便利になります。seeds.rbで初期データを管理しているアプリケーションがあればseed_fuに移行してみてはいかがでしょうか。