Rails ActiveRecord でランダムにレコードを取得する方法

Rails Add comments

まぁ受け売りなんですが、備忘録としてメモ。

モデル名 : 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 プログラムでランダムにする方法なんかも載ってます。それでは。

Leave a Reply

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン