効率的なseedの書き方


seeds.rb

Railsで初期データを格納する場合、あらかじめseeds.rbでデータをcreateしておくという手法が一般的だと思われます。
ただ、モデルが増えていくと自ずと投入したいデータは肥大化していき、seedで管理するのが面倒になりませんか??

管理の方法

ある種思想の話になりますが、私はdevelop/test/productionでそれぞれseedデータは分けるべきだと考えています。
従って下記のようにseedを管理しています。

格納フォルダ作成

$ mkdir -p db/seeds/development
$ mkdir -p db/seeds/test
$ mkdir -p db/seeds/production

seedデータを格納するseedsフォルダを作成しました。
さらに実行環境毎にフォルダを分けています。

データを投入

$ touch db/seeds/development/users.rb
$ touch db/seeds/test/users.rb
$ touch db/seeds/production/users.rb
db/seeds/development/users.rb
User.create!(
  email: test@example.com
  password: password
  name: nara
)

各フォルダにデータ投入用のファイルを作成します。
また、必要なファイルに初期データを投入します。

seed.rbで環境毎に読み込むフォルダを変更

db/seed.rb
tables = %w(users) #読み込むseedデータのファイル名

tables.each do |table|
  path = Rails.root.join("db", "seeds", Rails.env, "{table}.rb" #環境毎のpathの指定
  if File.exist?(path)
    puts "Creating #{table}..."
    require(path)
  end
end

tablesという変数に配列で読み込むファイル名を指定します。(複数ある場合でも、付け加えていけば大丈夫です。)
そして、それらをeachで回した上で、環境毎にpathを発行し読み込むseedの分岐を行なってあげます。

これにより、環境毎に読み込む先のフォルダを変更でき、かつseed.rbに全ての初期データを書く必要がなくなるため肥大化を抑えつつ効率よく初期データを作成することが可能になります。

まとめ

seedは肥大化するとイライラの原因になるのでできるだけ避けましょう。