#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
, поэтому вам тоже нужно это проверить