Help us understand the problem. What is going on with this article?

Railsの初期データを投入する方法

More than 1 year has passed since last update.

シードファイルを使う

ごく一般的な方法はシードファイルで初期データを入れる方法です。

db/seeds.rb
users = ["太郎", "花子", "次郎", "京子"]
users.each do |user|
  User.create(name: user)
end

seeds.rb に初期データを記述して、コマンド bundle exec rails db:seeds を叩けば User テーブルに投入されます。

シードファイルの問題点

後々になって追加で初期データを投入したい場合、すでにテーブルにある初期データを削除して、いちから入れる必要があるが、データを削除するのは怖さがある。

db/seeds.rb
# users テーブルを trancate
ActiveRecord::Base.connection.execute('TRUNCATE TABLE `users`')

users = ["太郎", "花子", "次郎", "京子", "三郎"] # 三郎が追加
users.each do |user|
  User.create(name: user)
end

開発環境ならこれでもいいが、本番環境でこんなことはしたくない。
なので、もっと安全な方法で初期データを投入する。

マイグレーションファイルを使う

みんな大好きマイグレーションファイルで初期データを投入する。

コマンドでマイグレーションファイルを作成

$ bundle exec rails g migration insertInitialUsers

マイグレーションファイルに投入したいデータを追加

db/migrate/xxxxxxxxxxxxxx_insert_initial_users.rb
class InsertInitialUsers < ActiveRecord::Migration[5.2]
  def change
    users = ["太郎", "花子", "次郎", "京子"]
    users.each do |user|
      User.create(name: user)
    end
  end
end

マイグレーションを実行

$ bundle exec rails db:migrate

これで初期データの投入が完了する。
そしてシードファイルで問題になっていた、追加で初期データを投入する場合は新しくマイグレーションファイルを作り、追加分のデータだけ記述すればよい。

$ bundle exec rails g migration addInitialUsers
db/migrate/xxxxxxxxxxxxxx_add_initial_users.rb
class InsertInitialUsers < ActiveRecord::Migration[5.2]
  def change
    users = ["三郎", "佳子"]
    users.each do |user|
      User.create(name: user)
    end
  end
end

これによって、本番環境へのデプロイ時にマイグレーションが実行されれば、そのまま初期データの投入が完了される。

mHadate
フロントエンドエンジニア、サーバサイドエンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away