Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
185
Help us understand the problem. What is going on with this article?
@takehanKosuke

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に書かれた内容をデータベースに反映させることができます。

185
Help us understand the problem. What is going on with this article?
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
takehanKosuke
心理学専攻/エンジニア歴2年/読書好き/ポーカー/ruby/golang
ca21
CyberAgentの21年新卒エンジニアで作るQiita Organizationです

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
185
Help us understand the problem. What is going on with this article?