Edited at

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


シードファイルを使う

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


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

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