Ruby on RailsでランダムにDBからランダムに値をとってくる方法

みなさんこんにちは!
イザナギです!
今回の記事は、プログラミング学習をしていて、詰まったことをブログにまとめて共有していきたいと思います。
私は、現在Ruby on Railsによるウェブアプリケーションを作成している途中なんですが、そこである問題に直面しました。
「ランダムにデータを取ってくるにはどうすればいいんだろう?」
ちなみに、利用するデータベースはMySQLです。
一応、以下のようなメソッドもあったのですが、


Modelname.all.sample

これでは処理に時間がかかりすぎるらしいので、別のメソッドを調べていきたいと思います。

whereを利用したメソッド

まず見つけたメソッドがこちらになります。


Modelname.where( 'id >= ?', rand(Modelname.first.id..Modelname.last.id) ).first

このメソッドについて説明していくと、


Modelname.where()

whereメソッドでModelnameのデータベースから()内の条件で得た値を全て取り出します。


( 'id >= ?', rand(Modelname.first.id..Modelname.last.id) 

「rand(Modelname.first.id..Modelname.last.id) 」で登録されている全てのIDの中からランダムにIDを選択します。
そのあと「’id <= ?’ 」の?のなかに値を代入しています。
そして最後に


.first

初めの値を1件を取り出しています。
他にも色々と調べてみましたが、


Modelname.where( 'id >= ?', rand(Modelname.first.id..Modelname.last.id) ).first

ですが、上記コードには弱点もあるみたいです。
IDに抜けがあるとランダムの正確性にかけてくるそうなんです。

offsetを使う方法


Modelname.offset( rand(Modelname.count) ).first

データをランダムに抽出し、オフセットする。
そのあとに、初めのデータを抽出するやり方です。
こちらのやり方ですと、正確性が1つ目のやり方よりあるそうです。
正確性が必要であればこのメソッドの方が良さそうですね。

まとめ

今回は他にも色々と調べてみましたが、1つ目のやり方が一番早いらしいので


Modelname.where( 'id >= ?', rand(Modelname.first.id..Modelname.last.id) ).first

を利用してウェブアプリケーションを書いていきたいと思います。
今回私が作るウェブアプリケーションは正確性はそれほど期待せず、
IDの歯抜けがない状態になりますので、1つ目のやり方で十分という判断になりました。
今回はプログラミングをしていて、詰まったところをブログとして残しました。
また詰まったところがあれば更新していきたいと思います!
それでは、今回はここで筆を置かせていただきます!
最後まで記事をご覧いただきありがとうございました!

参考

■関連記事(精度そんな良くないかもwww)

■関連トピック

2024 - Izanagi's Site