0
0

Fakerとseed.rbでUserに紐づいたBoardダミーデータを作成

Posted at

掲示板一覧機能の作成のために、Boardモデルを作りました。

今回は、Fakerを使ってseed.rbにuserに紐づいたboardのダミーデータを入れました。ただ、user_idの部分のコードがよく分からなかったのでメモに残します。
初学者なため間違っていところがあれば教えていただけると幸いです。

seed.rbに記述するまでの流れ

まずは、seed.rbを作るためにgemをインストールします。

gem "Faker"

bundle installしてseed.rbを作ります。

10人分のUserモデルのデータも作成してあります。

seed.rbに記述したコード

20個の掲示板のダミーデータを入れたかったので、繰り返し処理でBoardモデルのカラムに対してこのようにコードを設定しました。

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

そして、今回はUserモデルに紐づいたBoardモデルのデータを作ります。ですので、誰がどの掲示板を作成したのかわかるように10人のユーザーをBoardモデルのuser_idに振り分けていかないといけません。

user_idには以下のコードで数字を振り分けていきます。

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

ただ、このコードの意味を理解するまで時間がかかったので忘れないようにまとめてみました。

まずは今回初めてみた二つのメソッドについてまとめます。

offsetメソッド

offsetメソッドは、レコードを返す前にスキップするレコード数を指定します。

User.limit(5).offset(10)

例えば、このコードはユーザーの最初の10人をスキップして、次の11人目から最大5人のユーザーを返すという意味になります。

ちなみに、SQLはこのようになります。

SELECT * FROM users LIMIT 5 OFFSET 10

randメソッド

randメソッドは、渡した引数をランダムで返します。引数には、整数かRangeオブジェクトを渡すことができます。

rand(7)  #=> 3
rand(1..5)  #=> 2

整数の場合(rand(7)の方)は、0から指定した整数未満の整数を返します。(例でいうと、0~6)

Rangeオブジェクトの場合(rand(1..5)の方)は、指定した範囲の値を返します。

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

それでは、この部分について細かく分解して説明していきます。

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

User.count

まず、User.countはUserモデルのレコード数を返します。つまり、ユーザーというグループに属している人の数を数えるので、今回だと10を返します。

そうすると、User.count10に置き換わるので、()の中はrand(10)になります。

rand(User.count)

randメソッドは、渡した引数をランダムで返すのでしたね。そして、引数に整数を渡したときは、0から指定した整数未満の整数を返します。

上述で、rand(10)に置き換わったので、ここで返す整数は0~9のうちのどれかになります。

ただ、ここで1つ気になる部分が出てきます。あれ?ユーザーは10人で、idは1から始まるから1人分ズレることになる・・・。

それを解決してくれるのがoffsetなのです。

offset(rand(User.count)).first

offsetは渡した引数分のレコードをスキップします。rand(User.count)で今回だと0~9のどれかの整数を返すことがわかっています。

この二つを合わせると、

  • rand(User.count)で0が出た時

=> offsetで0をスキップして1からのレコードを返す。

  • rand(User.count)で9が出た時

=> offsetで9をスキップして10からのレコードを返す。
これで、先ほどのズレがなくなりました!

そして、firstで一番目のレコードを返すことで、ユーザーの中からランダムに1人選んで、Boardモデルに振り分けることができました。

まとめ

今回は、chatGPTを使いながら、コードの意味を解読することができました。

Railsガイドなどのサイトを見ても、わからない部分が結構あるので、chatGPTとうまく組み合わせながら、これからも一つ一つ疑問点を潰していこうと思います!

最後まで見ていただいてありがとうございます!

参考文献

https://railsguides.jp/active_record_querying.html#%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%82%92%E4%B8%80%E6%8B%AC%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%99%E3%82%8B
https://github.com/faker-ruby/faker/blob/main/README.md

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0