ランダムなレコードを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のパフォーマンスも考える必要があると感じた。