LoginSignup
16
9

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-29

シードファイルを使う

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

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

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

16
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
9