Railsのseed.rbで初期データの効率化
背景
初期データをいれる時は皆さんどうしていますか?
- Rails Consoleを使用している
- 管理画面からポチポチ入力している
上記の方法だと、db:resetなどした時に毎度登録し直し…なんて面倒…
実は、seed.rbを使えばそんなこと無縁にガンガンリセットできます。(リセットが正義ってわけではないが)
記述方法
genres = %w(釣り 野球 サッカー 水泳 サイクリング) # ポイント1
genres.each do |genre|
Genre.find_or_create_by(name: genre) # ポイント2
end
- ポイント1
配列を作る。配列の要素はスペース区切りで指定する。式の展開はされない。
ドキュメント - ポイント2
条件を指定して初めの1件を取得し、1件もなければ作成。これにより、複数回seedを実行しても重複登録がなくなります。
ドキュメント
サンプル投稿をたくさん作る時などに使えますね!
Deviseの場合
ちなみに、Deviseのユーザー作成の場合は、find_or_create_byは使えないのでご注意ください。Deviseのユーザーを作る場合は、以下のような書き方になると思います。
users = [
{email: 'user1@example.com', password: 'passw@rd'},
{email: 'user2@example.com', password: 'passw@rd'},
{email: 'user3@example.com', password: 'passw@rd'},
{email: 'user4@example.com', password: 'passw@rd'},
{email: 'user5@example.com', password: 'passw@rd'},
]
users.each do |user|
# 一度ユーザーをメールアドレスで検索
user_data = User.find_by(email: user[:email])
# 該当ユーザーがいなければ、createする
if user_data.nil?
User.create(
email: user[:email],
password: user[:password]
)
end
end