TojiTech No Programming, No Life.

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

Profile

Yuki Tojima

RubyやPhp、JavaScriptまわりのことを徒然と記録に残す技術ブログです。

至らぬところもあると思いますが、見守っていただけると幸いです。

記事のリクエストや、間違いなどありましたら X (旧 Twitter) のDMなどでお気軽にご連絡ください。

ytojima @TojiTech
プロフィール画像