2016-11-28 6 views
0

У меня есть массив изображений, которые я хочу перетасовать и показываю только первые десять результатов. Мне трудно понять, как это сделать.Перетасовка массива в рубине на рельсах

Вот мой код

<% @images.each.shuffle do |image| %> 
    <tr> 
    <td><%= image.name %></td> 
    <td> <%= image_tag image.picture.url %></td> 
    <td><%= image.likes %></td> 
    <td><%= link_to 'Show', image %></td> 
    <td><%= link_to 'Edit', edit_image_path(image) %></td> 
    <td><%= link_to 'Destroy', image, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 
+0

Является ли '@ images' объектом прокси-сервера AR? Если это так, вы можете настроить свой запрос таким образом, чтобы он выполнял команду DB-side в случайном порядке. т. е. '@images = Image.where (...). order (" rand() "). limit (10)'. Обратите внимание, что сортировка случайным образом не может использовать индексы, но лучше, чем загрузка всей таблицы в сторону ОЗУ. Это дает дополнительное преимущество в том, чтобы сохранять логику из ваших взглядов, что является лучшей практикой Rails. –

+0

@ChrisHeald, спасибо. Я должен был немного поработать, но я нашел ответ на стороне БД. Отправьте ответ, чтобы я мог дать вам кредит – Aaron

ответ

2

Вы можете использовать функцию выборки в классе Array.

<% @images.to_a.sample(10) do |image| %> 
1

Если @images просветляющее прокси-объект или результат какой-то другой запрос БД, вы можете настроить ваш запрос таким образом, что он делает перетасовка-и предела DB стороне:

@images = Image.where(...).order("rand()").limit(10) 

Обратите внимание, что сортировка случайным образом не может использовать индексы, но лучше, чем загрузка всей таблицы в сторону ОЗУ. Что-то вроде этого:

@images = Image.where(...) 
@images.to_a.sample(10) 

загрузит результаты всего запроса в ОЗУ в приложении Rails, которое будет довольно медленным.

Это дает дополнительное преимущество в сохранении логики из ваших представлений, что является лучшей практикой Rails.

(Отправлено в соответствии с запросом на запрос)