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))