在Rails中显示随机记录

时间:2014-06-30 09:15:17

标签: ruby-on-rails activerecord random records

我正在尝试使用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项目,而不必使用相同的项目两次?

2 个答案:

答案 0 :(得分:1)

尝试将@ads.find(:first)的实例更改为@ads.pop - pop从数组中删除一个项目并将其返回 - 对该数组的进一步调用将无法获得&#39;弹出&#39;项目了。

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

答案 1 :(得分:0)

而不是

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,因此您还需要检查