りゅうじの学習blog

学習したことをアウトプットしていきます。

Fakerでダミーデータをdb:seedで作成する

こんにちは。りゅうじです。

 

Fakerをインストールするまではいいがseeds.rbの書き方が全然わからん!といった初学者が初学者の為に書く記事です。

 

UserモデルとBoardモデルがある状態です。

 

db/seeds.rb

10.times do
  User.create(
      first_name: Faker::Name.first_name,
      last_name: Faker::Name.last_name,
      email: Faker::Internet.email,
      password: '12345678',
      password_confirmation: '12345678'
  )
end

20.times do |index|
  Board.create(
      user: User.offset(rand(User.count)).first,
      title: "タイトル#{index}",
      body: "本文#{index}"
  )
end

 

これを書いたらターミナルで

bundle exec rails db:seed

 

※bundle execをつける理由はGemfile.lockに書かれているバージョンでgemを動かす為です。本質的に理解したい人は調べてみてください。とりあえず付けといた方がいいで私は今はいいと思います。

 

createではなくcreate!を使う

userの作成に失敗したときにエラーを返してくれないと困りますよね。

createは作成に失敗してもエラーを返さないtrueかfalseです。

create!と書くだけでエラーのときはエラーを返してくれるようになります。

save!のときもそうだから、私と同じくらいの学習レベルの人ならわかるかもですが、seedを書くときに使うと認識しておくとスムーズです。

 

Faker::Name.first_name

ここ私はよくわかってなくて調べるのに時間がかかってしまいました。

Fakerの中に使えるものが決まっていてgithubに記載されているんですよね。

こちらを見て頂きこの中にあるものから選ぶ必要があります。

GitHub - faker-ruby/faker: A library for generating fake data such as names, addresses, and phone numbers.

 

User.offset(rand(User.count)).first

なんだそれ見た事ない!と思われたとしたら私と同志です。

ここで学びましょう!

offsetは特定範囲のレコードを取得するクエリメソッドで取得開始位置を指定します。

※クエリメソッドとはデータベースのデータを取得するメソッドの事です。

 

randは整数値を与えると、0からその整数値未満の整数を返す。わかりやすく言うとランダムって事です。

書き方の例:

0から6までのランダムな数値を取得するように書くと

rand(6)

サイコロのように1から6の場合は

rand(1..6)

となります。

User.countはrails consoleでやればわかりますがユーザーの数が出てきます。

最後のfirstはいつものやつです。最初のユーザーデータを取得する!

 

じゃあ

User.offset(rand(User.count)).first

はどういう事?ってなると

User.countで取得したユーザー数からランダムに数字を生成して、ユーザーテーブルの開始位置を指定して、その最初のユーザーデータを取得するとゆう事ですね。

 

なんか文字にされてもわかりづらいかも知れません。

ダミーデータでユーザーをUserモデルに作って、そのユーザーの投稿をBoardモデルに適当に作っちゃって!ってときに使うと覚えておけば十分だと思います。ただダミーデータが欲しいだけなので。

 

user_idではなくuserで指定している理由

これも私はなんでやねん!となりました。同志の方はここで学びましょう!

 

UserモデルとBoardモデルは紐付ける必要がありbelongs_toとhas_manyで関連付けをしています。

関連付けられたモデルでは、idではなくオブジェクトを指定可能になるから

user_idではなくuserとなる。

 

モデルがアソシエーションしている場合は、こう書けるって頭の片隅に置いておけば、今後見たときに、『あぁなんかあったな!』となるので良いかと思います。

 

では、引き続きお互い頑張りましょう^^