Это похоже на невероятно простую проблему, однако она не работает так тривиально, как я ожидал.
У меня есть клуб, в котором есть члены клуба, и я бы хотел вывести двух случайных членов из клуба.
Использование RANDOM ()
Один из способов - использовать случайный порядок:
club.members.find(:all, :order => 'RANDOM()').limit(2)
Однако это отличается для SqLite (база данных dev) и Postgres (production), поскольку в MySql команда имеет вид RAND()
.
Хотя я мог бы начать писать обертки вокруг этого, я чувствую, что тот факт, что это еще не было сделано и, кажется, не является частью ActiveRecord, говорит мне кое-что, и что СЛУЧАЙНЫЙ, возможно, не правильный путь.
Извлечение предметов напрямую по их индексу
Другой способ сделать это - вывести набор по порядку, но затем выбрать случайные записи из него:
Прежде всего нам нужно сгенерировать последовательность из двух уникальных индексов, соответствующих членам:
all_indices = 1..club.members.count
two_rand_indices = all_indices.to_a.shuffle.slice(0,2)
Это дает массив с двумя индексами, которые гарантированно будут уникальными и случайными. Мы можем использовать эти индексы, чтобы вытащить наши записи
@user1, @user2 = Club.members.values_at(*two_rand_indices)
Какой метод лучше?
Хотя второй метод выглядит довольно неплохо, я также чувствую, что могу что-то упустить и может усложнить простую проблему. Я, очевидно, не первый, кто занялся этим, так какой же самый лучший и наиболее эффективный для SQL маршрут через него?