#seedファイルって何?
seedファイルというのは簡単に言うと初期データのことです。
例えば、コーディング中に何らかの理由でデータベースをリセットした場合中に入っているデータももちろんですが消えてしまいます。
ですが、ユーザー登録機能がある場合リセットするたびに毎回ユーザー登録をし直す必要が出てきます。
仮にそれが普通のユーザーだった場合はそれでもいいかもしれませんが、アドミン権限をユーザーにrollカラムをつける形でアドミン権限の設定を行っていた場合、ユーザー登録のあとにコンソールでアドミン権限を付与するという2度手間になってしまいます。
なのでrailsではseedファイルに入れておきたいデータをdb/seeds.rb
に記述していきます。
今回は以下のような、userが複数のarticleを持つような構造を持つテーブルを考えたいと思います
基本
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に書かれた内容をデータベースに反映させることができます。