A Little Each Day

note to self

seed-fuを使ってdbに初期データ(シードデータ)を入れる

こんにちは。本日はRailsでseed-fuを使用して初期データ(シードデータ)を入れる方法です。

Railsはデフォルトで初期データを入れる機能(seeds.rbに初期データを書きrake db:seedをコマンド)がありますが、シードデータを入れるたびに毎回同じデータが登録されてしまいます。

また、単一のファイルのため、仮にたくさんの初期データをいれなければならなくなった時に、ファイルが肥大化して可読性が下がってしまうという問題もあります。

これらの問題を解決するために、「seed-fu」という便利なGemがあります。

簡単に初期データを入れることが出来る上、可読性も高く、チームで開発する場合でも役に立つことでしょう。

seed-fuを読み込む

まずはじめに、Gemfileにseed-fuを書いて使えるようにします。

gem "seed-fu"


そのままbundle installします。

$ bundle install


以上で読み込みは完了です。


シードデータを作る

seed-fuを使うには「fixtures」ファイルを作成して、その中にシードデータを書く必要があります。

ファイルを作る

シードデータを入れるファイルをモデル毎に作成します。

$ mkdir db/fixtures
$ mkdir db/fixtures/area.rb
$ mkdir db/fixtures/user.rb


seed-fuは「db/fixtures」以下のファイルを読み込んでくれるので、ここにモデル毎のシードデータを作っていきます。(これで可読性が高くなる)

シードデータを書く

ここでは例としてエリアモデルの初期データを作成してみましょう。

基本的には以下のようにデータごとにブロックで表します。

Area.seed do |s|
  s.id    = 1
  s.name  = "原宿"
end

Area.seed do |s|
  s.id    = 2
  s.name  = "下北沢"
end


もしたくさんの初期データがあるならば、以下のように書くこともできます。

Area.seed(:id,
  { :id => 1, :name => "原宿"   },
  { :id => 2, :name => "下北沢" }
)


以上でシードデータの書き込みは完了です。


シードデータを読み込む

シードデータの書き込みが終わったので、データを読み込んで初期登録しましょう。

$ rake db:seed_fu

== Seed from /****/****/****/****/db/fixtures/area.rb
  -
  -


以上でシードデータの登録は完了です。

データベースを見るときちんとseed-fuに書いたシードデータが登録されていることがわかると思います。


capistranoと連携する

seed-fuの便利なところは、capistranoと簡単に提携できるところです。

いちいちサーバーにログインしなくても、デプロイ時に自動でシードデータを読み込んでくれます。

# Capfile

require 'seed-fu/capistrano3'
# deploy.rb

namespace :deploy do
  before 'deploy:publishing', 'db:seed_fu'
end


これでデプロイすれば、自動で読み込まれます。便利ですね。



本日は以上です。