2009-07-20 3 views
2

Ich kenne die find_in_batches Methode für ActiveRecord, aber das erlaubt mir nicht, meine :order oder :limit einzustellen.Batch Looping Ein Modell mit Ruby

Ich versuche, meine Daten zu durchlaufen, und für jede 6 Elemente möchte ich sie in eine <div>.

Ich wurde ganz versuchen ...

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

Aber ich fühle mich dies die „Rails“ Art und Weise nicht effizient ist. Könnte ich mein Array möglicherweise in 4 verschiedene Arrays von 6 teilen? Ich versuche den besten Ansatz zu finden und hoffe, dass ihr helfen könnt.

Am Ende muss ich es so etwas kommen:

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

Vielen Dank im Voraus!

Antwort

18

Sie wollen 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

Viel sauberer als die obigen Lösungen und sehr gut lesbar –

+0

Es ist auch gut, ein <% es sei denn item.nil zu tun? %> falls Sie keine perfekten Daten haben. Genau das habe ich gebraucht, danke! – Garrett

1

könnten Sie die Optimierung starten, indem each_with_index statt each und <%=..%> anstelle der langen if s verwenden.

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

ohh, das ist eine nette Funktion. Vielen Dank! – Garrett

+0

Mit diesem Code wird ein div um jedes Element in der Schleife umgebrochen. Hier ist ein Link zu einem besseren Beispiel: http://gist.github.com/150498 – Garrett

+0

Ich habe es gerade von Ihrem Code übersetzt. Jetzt, da ich verstehe, was Sie wollen, würde ich etwas Ähnliches wie Michael's Antwort empfehlen. –

1

Eine Sache, die sauberer sein würde:

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

Die „Rails“ wie Art und Weise wäre es, die content_tag Helfer zu verwenden und alle Daten mit divs umgeben, eine bestimmte Klasse für den 6. div mit .

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

Zur Art einer Seite Teil Ihrer Frage zu beantworten: Sie sollten mit Bereichen entlang find_in_batches der Lage sein, zu verwenden (entweder Namen oder anonym) Optionen Ordnung und Grenze zu setzen.

+0

Ich habe einen: vorgestellten Umfang, aber ich muss in einer bestimmten Reihenfolge und begrenzen, wie viele ich möchte. – Garrett

+0

Sie würden also einen Bereich für die Reihenfolge und Begrenzung erstellen, die Sie möchten. – Chuck