ランダムなレコードを1件取得する
親モデルに紐付いた子モデルのテーブルのダミーを作る際、 親モデルの取得方法にハマってしまったので忘備録。
10.times do title = Faker::Restaurant.name #gem fakerを使ってます body = Faker::Restaurant.description user = User.offset(rand(User.count)).first # これ Board.create!( title: title, body: body, user: user ) end
BoardはUserに紐付いてるのでUserを取ってこないとBoradが作れない。 Userからランダムに1つ取ってきたい。
はじめ、
User.find(User.ids.sample)
や
User.find(User.pluck(:id).sample)
としていたが、Userテーブルから全てのidを取得してしまっていてSQLのパフォーマンスが悪い。
User.offset(rand(User.count)).first
とすることでランダムなレコードを1つだけ取得できるのでコスパ良し。
挙動が同じでもSQLのパフォーマンスも考える必要があると感じた。