みなさんこんにちは!
イザナギです!
今回の記事は、プログラミング学習をしていて、詰まったことをブログにまとめて共有していきたいと思います。
私は、現在Ruby on Railsによるウェブアプリケーションを作成している途中なんですが、そこである問題に直面しました。
「ランダムにデータを取ってくるにはどうすればいいんだろう?」
ちなみに、利用するデータベースはMySQLです。
一応、以下のようなメソッドもあったのですが、
Modelname.all.sample
みなさんこんにちは!
イザナギです!
今回の記事は、プログラミング学習をしていて、詰まったことをブログにまとめて共有していきたいと思います。
私は、現在Ruby on Railsによるウェブアプリケーションを作成している途中なんですが、そこである問題に直面しました。
「ランダムにデータを取ってくるにはどうすればいいんだろう?」
ちなみに、利用するデータベースはMySQLです。
一応、以下のようなメソッドもあったのですが、
Modelname.all.sample
これでは処理に時間がかかりすぎるらしいので、別のメソッドを調べていきたいと思います。
まず見つけたメソッドがこちらになります。
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に抜けがあるとランダムの正確性にかけてくるそうなんです。
Modelname.offset( rand(Modelname.count) ).first
データをランダムに抽出し、オフセットする。
そのあとに、初めのデータを抽出するやり方です。
こちらのやり方ですと、正確性が1つ目のやり方よりあるそうです。
正確性が必要であればこのメソッドの方が良さそうですね。
今回は他にも色々と調べてみましたが、1つ目のやり方が一番早いらしいので
Modelname.where( 'id >= ?', rand(Modelname.first.id..Modelname.last.id) ).first
を利用してウェブアプリケーションを書いていきたいと思います。
今回私が作るウェブアプリケーションは正確性はそれほど期待せず、
IDの歯抜けがない状態になりますので、1つ目のやり方で十分という判断になりました。
今回はプログラミングをしていて、詰まったところをブログとして残しました。
また詰まったところがあれば更新していきたいと思います!
それでは、今回はここで筆を置かせていただきます!
最後まで記事をご覧いただきありがとうございました!