2009-07-20 19 views
2

我知道ActiveRecord的find_in_batches方法,但這不允許我設置:order:limit批量循環使用紅寶石的模型

我試圖循環瀏覽我的數據,並且每隔6項我想將它們包裝在<div>中。

我是想整...

<% 
i = 0 
@media.each do |media| 
%> 
<% if i%6 %><div class="section"><% end %> 
    [...] 
<% if i%6 %></div><% end %> 
<% 
i += 1 
end 
%> 

但我覺得這是效率不高的「導軌」的方式。我可以將我的數組分成4個不同的6個數組嗎?我試圖找到最好的方法,並希望你們能夠提供幫助。

最後,我需要它出來是這樣的:

<!-- 
    I have 24 items in my array, and I need to wrap every 6 inside a div. 
--> 
<div class="section"> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
</div> 

<div class="section"> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
</div> 

<div class="section"> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
</div> 

<div class="section"> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
    <div class="item"></div> 
</div> 

提前感謝!

回答

18

你想in_groups_of:

<% @items.in_groups_of(6) do |group| %> 
    <div class="section"> 
     <% group.each do |item| %> 
      <div class="item"></div> 
     <% end %> 
    </div> 
<% end %> 
1

您可以使用each_with_index代替each<%=..%>而不是長的if s開始優化。

<% @media.each_with_index do |media, i| %> 
<%= (i % 6) ? '<div class="section">' : '' %> 
    [...] 
<%= (i % 6) ? '</div>' : '' %> 
<% end %> 
+0

喔,這是一個整潔的功能。謝謝! – Garrett 2009-07-20 18:30:17

+0

使用該代碼,它會在循環中的每個項目周圍包裝一個div。這裏是一個更好的例子的鏈接:http://gist.github.com/150498 – Garrett 2009-07-20 18:38:51

+0

我只是把它翻譯成你的代碼。現在我明白你想要什麼了,我會推薦類似Micheal的答案。 – 2009-07-20 18:55:20

1

一兩件事,這將是清潔:

<% while @media.size > 0 do %> 
    <div> 
    <%= @media.slice!(0,6).map{|m| m.to_html}.join('</br>') 
    </div> 
<%end%> 
0

最「Rails的」之類的方法是使用content_tag助手和環繞用div的所有數據,使用一個特定的類第六屆DIV 。

<% @media.each_with_index do |m, i| %> 
    <% content_tag(:div, :class => ((i % 6==0)? 'six' : 'other')) do %> 
    <%= m %> 
    <% end%> 
<% end %> 
1

要回答那種你的問題的側部的:你應該能夠使用find_in_batches連同範圍(無論是命名或匿名)設定順序和限制選項。