1. ホーム
  2. ruby-on-rails

[解決済み] Rails 3: ランダムレコードの取得

2022-07-03 10:17:13

質問

Rails 2でランダムなレコードを見つける例をいくつか見つけたのですが、好ましい方法は以下のようです。

Thing.find :first, :offset => rand(Thing.count)

初心者なので、Rails 3の新しいfind構文を使ってどのように構築できるのかよくわかりません。

では、ランダムなレコードを見つけるための"Rails 3 Way"は何でしょうか?

どのように解決するのですか?

Thing.first(:order => "RANDOM()") # For MySQL :order => "RAND()", - thanx, @DanSingerman
# Rails 3
Thing.order("RANDOM()").first

または

Thing.first(:offset => rand(Thing.count))
# Rails 3
Thing.offset(rand(Thing.count)).first

実は、Rails 3ではすべての例が動作します。しかし、順序 RANDOM を使うのは大きなテーブルではかなり遅いですが、よりSQL的な

UPDです。インデックス付きカラム(PostgreSQLの構文)に対して、以下のようなトリックを使うことができます。

select * 
from my_table 
where id >= trunc(
  random() * (select max(id) from my_table) + 1
) 
order by id 
limit 1;