代码之家  ›  专栏  ›  技术社区  ›  Garrett

用Ruby批量循环模型

  •  2
  • Garrett  · 技术社区  · 15 年前

    我知道 find_in_batches ActiveRecord的方法,但这不允许我设置 :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>
    

    事先谢谢!

    5 回复  |  直到 15 年前
        1
  •  18
  •   Benjamin Curtis    15 年前

    您需要以下分组:

    <% @items.in_groups_of(6) do |group| %>
        <div class="section">
            <% group.each do |item| %>
                <div class="item"></div>
            <% end %>
        </div>
    <% end %>
    
        2
  •  2
  •   Sinan Taifour    15 年前

    您可以使用 each_with_index 而不是 each <%=..%> 而不是长的 if S.

    <% @media.each_with_index do |media, i| %>
    <%= (i % 6) ? '<div class="section">' : '' %>
        [...]
    <%= (i % 6) ? '</div>' : '' %>
    <% end %>
    
        3
  •  2
  •   Michael Sofaer    15 年前

    有一件事会更干净:

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

    回答问题的一个侧面部分:你应该能够使用 find_in_batches 与作用域(命名或匿名)一起设置顺序和限制选项。

        5
  •  0
  •   codeprimate    15 年前

    最“rails”的方式是使用content-tag-helper并用div包围所有数据,使用第6个div的特定类。

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