Rails 3: получить случайную запись - PullRequest
131 голосов
/ 17 марта 2011

Итак, я нашел несколько примеров для поиска случайной записи в Rails 2 - предпочтительный метод выглядит так:

Thing.find :first, :offset => rand(Thing.count)

Будучи новичком, я не уверен, как это можно построить, используя новый синтаксис поиска в Rails 3.

Итак, что такое "Rails 3 Way" для поиска случайной записи?

Ответы [ 14 ]

1 голос
/ 29 мая 2018

Настоятельно рекомендуем этот гем для случайных записей, который специально разработан для таблицы с большим количеством строк данных:

https://github.com/haopingfan/quick_random_records

Все остальные ответы плохо работают с большой базой данных, кроме этого гема:

  1. quick_random_records стоит всего 4.6ms всего.

enter image description here

  1. принятый ответ User.order('RAND()').limit(10) стоимость 733.0ms.

enter image description here

  1. offset стоимость захода на посадку 245.4ms всего.

enter image description here

  1. User.all.sample(10) стоимость захода на посадку 573.4ms.

enter image description here

Примечание. В моей таблице всего 120 000 пользователей. Чем больше у вас записей, тем больше будет разница в производительности.


ОБНОВЛЕНИЕ:

Выполнить в таблице с 550 000 строк

  1. Model.where(id: Model.pluck(:id).sample(10)) стоимость 1384.0ms

enter image description here

  1. gem: quick_random_records только стоимость 6.4ms всего

enter image description here

1 голос
/ 04 мая 2016

При использовании Oracle

User.limit(10).order("DBMS_RANDOM.VALUE")

Вывод

SELECT * FROM users ORDER BY DBMS_RANDOM.VALUE WHERE ROWNUM <= 10
0 голосов
/ 27 августа 2013

Очень простой способ получить несколько случайных записей из таблицы. Это делает 2 дешевых запроса.

Model.where(id: Model.pluck(:id).sample(3))

Вы можете изменить «3» на количество случайных записей, которые вы хотите.

0 голосов
/ 04 апреля 2013

Я только что столкнулся с этой проблемой, разрабатывая небольшое приложение, в котором я хотел выбрать случайный вопрос из моей БД. Я использовал:

@question1 = Question.where(:lesson_id => params[:lesson_id]).shuffle[1]

И у меня это хорошо работает. Я не могу говорить о том, как производительность для больших БД, так как это всего лишь небольшое приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...