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に記載されているんですよね。
こちらを見て頂きこの中にあるものから選ぶ必要があります。
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となる。
モデルがアソシエーションしている場合は、こう書けるって頭の片隅に置いておけば、今後見たときに、『あぁなんかあったな!』となるので良いかと思います。
では、引き続きお互い頑張りましょう^^