Отображение случайных записей в Rails

#ruby-on-rails #activerecord #random #records

#ruby-on-rails #activerecord #Случайный #записи

Вопрос:

Я экспериментирую с Rails и хотел отобразить массив в массиве, это работает; код index.html.erb ниже:

 <div id="events">
  <% @events.each_with_index do |event, i| %>
    <%= link_to event_path(event) do %>
    <div class="card">
      <div class="image" style="background-image: url('<%= event.image.url %>')"></div>
      <div class="text">
        <h2><%= event.name %></h2>
        <div class="location"><%= event.location %></div>
        <date><strong><%= l event.date_start, :format => :day %> – <%= l event.date_end, :format => :day %> <%= l event.date_end, :format => :month %> </strong><%= l event.date_end, :format => :year %></date>
      </div>
    </div>
    <% end %>
    <%if i%1 == 1 %>
      <% @ads.find(:first) do |ad| %>
        <%= ad.name %>
      <% end %>
    <% end %>
    <%if (i 1)%4 == 0 %>
      <% @ads.find(:first) do |ad| %>
        <a href="<%= ad.url %>" target="_blank" class="ad">
          <div class="card">
            <%= ad.name %>
          </div>
        </a>
      <% end %>
    <% end %>
  <% end %>
</div>
  

И events_controller:

 def index
  @ads = Ad.all.shuffle
end
  

Пока работает довольно хорошо, после 4 элементов @events я получаю один @ads, случайный. Однако все
элементы @ads всегда являются одним и тем же случайным.

Как я могу отображать случайные элементы @ads на странице, не повторяя одно и то же дважды?

Комментарии:

1. «Элементы @ads всегда являются одним и тем же случайным». @ads.find(:first) — у вас очень гибкое определение «случайного» 🙂

2. @SergioTulentsev Да, я все еще новичок в этом. Однако выбор первого случайного массива пока работает довольно прилично.

3. @user2861994 Можете ли вы попробовать метод выборки — Ad.all.sample

4. @Icicle это дает мне «NoMethodError»: неопределенный метод `find» для #<Объявление: 0x007f84b97dbd20>

5. @user2861994 Этот метод не будет работать с вашим объектом модели. sample — это метод массива.

Ответ №1:

Попробуйте изменить экземпляры @ads.find(:first) to @ads.pop pop, чтобы удалить элемент из массива и вернуть его — при дальнейших вызовах этого массива элемент ‘popped’ больше не будет.

 a = [ "a", "b", "c", "d" ]
a.pop     #=> "d"
a.pop(2)  #=> ["b", "c"]
a         #=> ["a"]
  

Комментарии:

1. Если я попробую pop, он не отображает @ads

2. не используйте @ads.pop{} . попробуйте <% add = @ads.pop %> тогда <a href="<%= ad.url %>" target="_blank" class="ad"> .

3. Нравится это? <% add = @ads.pop %> <a href=»<%= ad.url %>» target=»_blank» class=»ad»> <div class=»card»> <%= ad.name %> </div> </a> <% end %>

Ответ №2:

Вместо

 def index
  @ads = Ad.all.shuffle
end
  

Вы могли бы использовать

 def index
  @ads = Ad.all.to_a.shuffle
end
  

пока все ваши Ad записи хранятся в массиве, перемешиваются

Тогда, по вашему мнению, вместо

 <% @ads.find(:first) do |ad| %>
  <%= ad.name %>
<% end %>
  

Вы могли бы использовать

 <% ad = @ads.pop %>
<%= ad.name %>
  

Которые дают вам один Ad и удаляют его из массива, чтобы вы не получили его во второй раз

Обратите внимание, что в этом случае мы не используем блок

Также обратите внимание, что, когда ваш массив пуст, ad.name он будет повышен NoMethodError , поэтому вам тоже нужно это проверить