railsのseedの書き方いろいろ


seedファイルって何?

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

今回は以下のような、userが複数のarticleを持つような構造を持つテーブルを考えたいと思います

基本

User.create!(
   email: '[email protected]',
   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: '[email protected]',
      name: 'テスト太郎',
      image: File.open('./app/assets/images/test.jpg')
    },
    {
      email: '[email protected]',
      name: 'テスト徹子',
      image: File.open('./app/assets/images/test.jpg')
    }
  ]
)

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

配列系2

[
  ['[email protected]', 'テスト太郎', image: File.open('./app/assets/images/test.jpg')],
  ['[email protected]', 'テスト徹子', 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に書かれた内容をデータベースに反映させることができます。