質問: Book.where('id >= ?', rand(Book.first.id..Book.last.id)).first(4) end ``` プログラミング初心者です。よろしくお願いいたします。
回答: エッジケースを満たせていませんね。 Book.count == 20のときにrand(20)が19に評価された場合 `Book.offset(19).first(4)` となり、最後の1冊しか取得できませんよね。 4 / (0..19).size = 1/5となり、現象が4〜5回に1回起きるのも順当でしょう。 batch_size = 4 Book.offset(rand(Book.count-batch_size)).first(batch_size) などとするのが妥当ではないでしょうか。 しかしながら、Book.countがそもそも4未満のときも考えなければならないです。 (あと「ランダムにn件取得」は、厳密にはLIMIT, OFFSETでは実現できませんね。Railsでは何もしなければ自動でidによるsortが入る様になっているので、連続したレコードしか取得できないですし。)