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

Ruby
この記事は約3分で読めます。

みなさんこんにちは!

イザナギです!

今回の記事は、プログラミング学習をしていて、詰まったことをブログにまとめて共有していきたいと思います。

私は、現在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つ目のやり方で十分という判断になりました。

今回はプログラミングをしていて、詰まったところをブログとして残しました。

また詰まったところがあれば更新していきたいと思います!

それでは、今回はここで筆を置かせていただきます!

最後まで記事をご覧いただきありがとうございました!

参考

コメント

タイトルとURLをコピーしました