2009-07-20 6 views
2

Je connais la méthode find_in_batches pour ActiveRecord, mais cela ne me permet pas de définir mon :order ou :limit. J'essaye de faire défiler mes données, et pour chaque 6 articles je veux les emballer dans un <div>.Bouclage par lots Un modèle avec Ruby

Je tentais de tout ...

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

Mais je pense que ce n'est pas efficace comme « Rails ». Pourrais-je diviser mon tableau en 4 tableaux différents de 6? J'essaye de trouver la meilleure approche à ceci et j'espérais que vous pourriez aider.

En fin de compte j'ai besoin de sortir quelque chose comme ceci:

<!-- 
    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> 

Merci à l'avance!

Répondre

18

Vous voulez in_groups_of:

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

Beaucoup plus propre que les solutions ci-dessus et très lisible –

+0

Il est aussi probablement bon de faire un <% sauf item.nil? %> vous ne disposez pas d'un ensemble de données parfait. C'est exactement ce dont j'avais besoin, merci! – Garrett

1

Vous pouvez commencer à optimiser en utilisant each_with_index au lieu de each et <%=..%> au lieu du long if s.

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

ohh, qui est une fonction propre. Merci! – Garrett

+0

En utilisant ce code, il enveloppe un div autour de chaque élément de la boucle. Voici un lien vers un meilleur exemple: http://gist.github.com/150498 – Garrett

+0

Je viens de le traduire directement à partir de votre code. Maintenant que je comprends ce que vous voulez, je recommanderais quelque chose de similaire à la réponse de Micheal. –

1

Une chose qui serait plus propre:

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

Les plus « Rails » comme moyen serait d'utiliser l'aide de content_tag et entourer toutes les données avec divs, en utilisant une classe spécifique pour le 6e div .

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

Pour répondre genre d'une partie latérale de votre question: Vous devriez pouvoir utiliser find_in_batches ainsi que des champs d'application (soit nommé ou anonyme) pour définir les options de commande et limites.

+0

J'ai une portée: en vedette, mais j'ai besoin de tirer dans un certain ordre et de limiter combien je veux. – Garrett

+0

Donc vous créez une portée pour l'ordre et la limite que vous voulez. – Chuck