シードファイルを使う
ごく一般的な方法はシードファイルで初期データを入れる方法です。
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
これによって、本番環境へのデプロイ時にマイグレーションが実行されれば、そのまま初期データの投入が完了される。