261
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

railsのseedの書き方いろいろ

seedファイルって何?

seedファイルというのは簡単に言うと初期データのことです。  
例えば、コーディング中に何らかの理由でデータベースをリセットした場合中に入っているデータももちろんですが消えてしまいます。
ですが、ユーザー登録機能がある場合リセットするたびに毎回ユーザー登録をし直す必要が出てきます。  
仮にそれが普通のユーザーだった場合はそれでもいいかもしれませんが、アドミン権限をユーザーにrollカラムをつける形でアドミン権限の設定を行っていた場合、ユーザー登録のあとにコンソールでアドミン権限を付与するという2度手間になってしまいます。  
なのでrailsではseedファイルに入れておきたいデータをdb/seeds.rbに記述していきます。  

今回は以下のような、userが複数のarticleを持つような構造を持つテーブルを考えたいと思います
スクリーンショット 2020-05-27 14.46.29.png

基本

User.create!(
   email: 'test@test.com',
   name: 'テスト太郎',
   image: File.open('./app/assets/images/test.jpg')
)

おそらくこの書き方が一番ベーシックで基本となる書き方だと思う。
なんかよくわからないときはこうやって書いておけばなんとかなる。

複数のユーザーを一気に作る

  5.times do |n|
    User.create!(
      email: "test#{n + 1}@test.com",
      name: "テスト太郎#{n + 1}",
      image: File.open('./app/assets/images/test.jpg')
    )
  end

rubyのfor文を使って複数のユーザーを作っていくやり方です。
userとかだとemailはuniqueバリデーション(同じカラム内に同じデータは存在できない)がかかってることが多いと思うのでemail内に変数を入れて同じデータが作成されないようにしています。

関連記事を作る

User.all.each do |user|
  user.articles.create!(
    title: 'タイトル',
    body: 'テキストテキストテキストテキスト'
  )
end

このような形で実装するとuserに紐づいたarticleを作成することができる
(複数形になってるところが割とハマりポイントなのでお気をつけて!)

番外編

配列系1

User.create!(
  [
    {
      email: 'test1@test.com',
      name: 'テスト太郎',
      image: File.open('./app/assets/images/test.jpg')
    },
    {
      email: 'test2@test.com',
      name: 'テスト徹子',
      image: File.open('./app/assets/images/test.jpg')
    }
  ]
)

個別にレコードを複数作成したいときはこんな感じに配列の中に入れてあげると、一気に作成してくれる。

配列系2

[
  ['test1@test.com', 'テスト太郎', image: File.open('./app/assets/images/test.jpg')],
  ['test2@test.com', 'テスト徹子', image: File.open('./app/assets/images/test.jpg')]
].each do |mail, name, img|
  User.create!(
    { email: mail, name: name, image: img}
  )

この書き方は無駄な記述が一番少ないような気がする。
でも、カラム数が多くなるとどれがどのカラムを指しているのかがわかりにくくなるのが欠点かと、、、

まとめ

seedファイルを書いたあとは

rails db:seed

としてあげることでseedに書かれた内容をデータベースに反映させることができます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
261
Help us understand the problem. What are the problem?