まぁ受け売りなんですが、備忘録としてメモ。
モデル名 : Item として読んでくだしあ。
ランダムに 1 レコードを取得したい場合
発行する SQL は2回だけど DB 依存しないパターン(offset 使ってるから割と早そう)
offset = rand(Item.count :all)
Item.find :first, :offset => offset
発行する SQL は1回だけど DB 依存するパターン(MySQLの場合)
Item.find(:first, :order => 'RAND()')
ランダムに N レコードを取得したい場合(MySQLの場合)
Item.find(:all, :order => 'RAND()', :limit => 10)
ちなみに、’RAND()’ は DB に依存するコマンドなので要注意!他のDBの場合は、
- Postgresql / SQLite : RANDOM()
- Microsoft SQL Server : NEWID()
- Oracle : dbms_random.value
参照 : SQL to Select a random row from a database table
※ SQLite と MySQL しか試してないです。ごめんなさい><
Rails ActiveRecord は、結局 :order で渡された文字列を SQL を生成するときに、 ORDER の後に繋げてるだけなので、書いたままの SQL が出来ると思えば好きなように書けるんですねぇ。
あと、当たり前だけどレコード数が多いと、きっと困ることになると思います。そもそもレコード数が多いテーブルからランダムに N レコード取得したいっていう要望が、そもそも間違ってる気もしますが。
詳細はこちら(英語)へ。性能の話や、DB に依存するのではなくて Ruby プログラムでランダムにする方法なんかも載ってます。それでは。
Recent Comments