Rails: получить определенное количество случайных записей - PullRequest
7 голосов
/ 17 марта 2011

Итак, в моем приложении есть фотографии, которые принадлежат коллекциям. Я хочу иметь возможность показывать 13 фотографий из определенной коллекции на странице.

Я пробовал это:

c = Collection.first
@photos = c.photos.offset(rand(c.photos.count)).limit(13)

Это работает, вроде. Проблема в том, что если в коллекции не более 13 фотографий, она не обязательно возвращает 13 фотографий. Мне нужно специально получить ровно 13 фотографий.

FWIW В случае моего приложения коллекция создается только администраторами / модами, поэтому мы можем обеспечить, чтобы ни в одной коллекции не было менее 13 фотографий. Что мне нужно, так это иметь возможность начинать выборку фотографий случайным образом, если доступно более 13.

Как я мог это сделать?

Ответы [ 3 ]

13 голосов
/ 17 марта 2011

Вы можете сначала выбрать 13 случайных связанных идентификаторов фотографий, а затем выполнить запрос к базе данных, чтобы получить их:

c = Collection.first
random_ids = c.photo_ids.sort_by { rand }.slice(0, 13)
@photos = Photo.where(:id => random_ids)
6 голосов
/ 17 марта 2011

Просто отсортируйте их случайным образом в sql и возьмите первые 13. так же:

c.photos.order("RAND()").limit(13)
0 голосов
/ 07 июня 2016

Вот быстрое решение ... в настоящее время его используют с более чем 1,5 миллионами записей и получая приличную производительность. Лучшим решением было бы кэшировать один или несколько случайных наборов записей, а затем обновлять их фоновым рабочим с желаемым интервалом.

Создано random_records_helper.rb Файл:

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