Как выбрать 6 случайных записей из таблицы - PullRequest
0 голосов
/ 18 сентября 2018

My portfolio_controller.rb имеет такой метод индекса:

def index
  @portfolio = PortfolioItem.all
end

Как я могу указать в условии, что код в этом блоке должен быть выполнен 6 раз? Другими словами, как я могу получить ровно 6 значений из объекта @portfolio в моем представлении, используя цикл? Это то, что я до сих пор:

<% @portfolio.shuffle.each do |portfo| %>

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Использование all, за которым следует shuffle, является плохим решением по двум причинам.

Небольшим улучшением было бы использование sample(6) вместо shuffle.first(6), так как это удаляет шаг из процесса.

Тем не менее, большая проблема заключается в том, что Portfolio.all.<something> (где метод <something> требует преобразования данных в рубин Array) извлечет все данных в память - что является плохая идея. По мере роста таблицы это приведет к увеличению производительности.

Лучшая идея - выполнить «случайный выбор» в SQL (с использованием методов order и limit), а не в ruby. Это исключает необходимость извлечения других данных в память.

Точное решение, к сожалению, зависит от базы данных. Для PostgreSQL и SQLite используйте:

Portfolio.order('RANDOM()').limit(6).each do |portfolio|

Или для MySQL используйте:

Portfolio.order('RAND()').limit(6).each do |portfolio|

Вы можете определить это как помощник в модели Portfolio - например:

class Portfolio < ApplicationRecord
  # ...

  scope :random_sample, ->(n) { order('RANDOM()').limit(n) }

  # ...
end

А потом по вашему мнению:

@portfolio.random_sample(6).each do |portfolio|
0 голосов
/ 18 сентября 2018

изменить на

<% @portfolio.shuffle.first(6).each do |portfo| %>
0 голосов
/ 18 сентября 2018
<% @portfolio.shuffle.each_with_index do |portfo, index| %>
  <%if index <= 6%>
    <p><%= portfo.title %></p>
  <%end%>
<% end %>

Или Вы можете сделать это как

<% @portfolio.shuffle.take(6).each do |portfo| %>
    <p><%= portfo.title %></p>
<% end %>
0 голосов
/ 18 сентября 2018

Вы можете что-то вроде этого:

 <%(1..6).each do |i| %>
     <% #your statements %>
 <%end%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...