掲示板一覧機能の作成のために、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.count
が10
に置き換わるので、()
の中は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