Если таблица не содержит слишком много записей, следующее вернет четырех случайно выбранных пользователей:
User.find(:all, :order => 'RANDOM()', :limit => 4)
Однако, это не масштабируется, поскольку оно рандомизирует всю таблицу . Для таблиц с большим количеством столбцов это может быть очень интенсивным вводом-выводом.
Другой метод состоит в том, чтобы только рандомизировать id
, а затем выбирать только эти строки. Что-то вроде:
# Return an array of ids randomly drawn from User
ids = ActiveRecord::Base.connection.select_values(
User.send(:construct_finder_sql, { :select => 'id',
:order => 'RANDOM()',
:limit => 4
}))
# Return the users drawn from above
users = User.find(:all, :conditions => "id IN (#{ids.join(',')})")
Если вы пойдете с этим, я бы инкапсулировал его как метод класса User
.