2009-07-20 18 views
2

私はActiveRecordのfind_in_batchesメソッドを知っていますが、:orderまたは:limitを設定することはできません。Rubyでモデルをバッチ処理する

私はデータをループしていますが、6つのアイテムごとに<divでラップしたいと思います。

私は、全体の...

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

にしようとしていた。しかし、私は、これは「Railsの」方法は効率的ではない感じ。おそらく私の配列を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 %> 
+0

上記の解決策よりもはるかに洗練されており、非常に読みやすい –

+0

item.nilを除いて<%を実行するとよいでしょうか? %>あなたは完全なデータセットを持っていません。これはまさに私が必要なものです、ありがとう! – Garrett

1

の代わりにeach_with_indexを使用し、ifの代わりに<%=..%>を使用して最適化を開始できます。きれいになり

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

。ありがとう! – Garrett

+0

このコードを使用すると、ループ内のすべてのアイテムの周りにdivがラップされます。ここに、より良い例へのリンクがあります:http://gist.github.com/150498 – Garrett

+0

私はあなたのコードからすぐに翻訳しました。あなたが望むものが分かったので、マイケルの答えに似たものをお勧めします。 –

1

一つのこと:

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

道のような最も「Railsは」第6回のdivのための特定のクラスを使用して、content_tagヘルパーを使用して、divタグですべてのデータを囲むようになります。ご注文とリミットのオプションを設定するスコープ(名前付きまたは匿名のいずれか)と一緒にfind_in_batchesを使用することができるはずです。あなたの質問の側部の種類を答えるために

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

+0

私は:フィーチャーされた範囲を持っていますが、私は特定の順序で引き出し、必要な数を制限する必要があります。 – Garrett

+0

したがって、必要な注文と制限の有効範囲を作成します。 – Chuck

関連する問題