Rails: получить определенное количество случайных записей
Итак, в моем приложении есть фотографии, принадлежащие коллекциям. Я хочу иметь возможность показывать 13 фотографий из определенной коллекции на странице.
Я попытался это:
c = Collection.first
@photos = c.photos.offset(rand(c.photos.count)).limit(13)
это работает, вроде. Проблема в том, что если в коллекции не намного больше 13 фотографий, то она не обязательно возвращает 13 фотографий. Мне нужно конкретно получить ровно 13 фотографий.
FWIW в случае моего приложения коллекция создается только администраторами / модами, поэтому мы можем обеспечить, чтобы нет коллекция будет иметь менее 13 фотографий. Что мне нужно, это иметь возможность начать делать выбор фотографий случайным образом еще раз, чем 13 доступны.
Как я мог это сделать?
3 ответов
вы можете сначала выбрать 13 случайных связанных идентификаторов фотографий, а затем выполнить запрос базы данных, чтобы получить их:
c = Collection.first
random_ids = c.photo_ids.sort_by { rand }.slice(0, 13)
@photos = Photo.where(:id => random_ids)
просто отсортируйте их случайным образом в sql и возьмите первые 13. так что:
c.photos.order("RAND()").limit(13)
вот быстрое решение.. в настоящее время он использует его с более чем 1,5 миллионами записей и получает достойную производительность. Лучшим решением было бы кэшировать один или несколько случайных наборов записей, а затем обновлять их с помощью фонового рабочего с требуемым интервалом.
создано :
module RandomRecordsHelper
def random_user_ids(n)
user_ids = []
user_count = User.count
n.times{user_ids << rand(1..user_count)}
return user_ids
end
в контроллере:
@users = User.where(id: random_user_ids(10))