Пакетная петля модель с рубином - PullRequest
2 голосов
/ 20 июля 2009

Мне известен метод 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
%>

Но я чувствую, что это неэффективный способ "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>

Заранее спасибо!

Ответы [ 5 ]

18 голосов
/ 20 июля 2009

Вы хотите in_groups_of:

<% @items.in_groups_of(6) do |group| %>
    <div class="section">
        <% group.each do |item| %>
            <div class="item"></div>
        <% end %>
    </div>
<% end %>
2 голосов
/ 20 июля 2009

Чтобы ответить на некоторые вопросы: Вы должны использовать find_in_batches вместе с областями (именованными или анонимными), чтобы установить порядок и ограничить параметры.

2 голосов
/ 20 июля 2009

Одна вещь, которая будет чище:

<% while @media.size > 0 do %>
  <div>
  <%= @media.slice!(0,6).map{|m| m.to_html}.join('</br>')
  </div>
<%end%>
2 голосов
/ 20 июля 2009

Вы можете начать оптимизацию, используя each_with_index вместо each и <%=..%> вместо длинных if с.

<% @media.each_with_index do |media, i| %>
<%= (i % 6) ? '<div class="section">' : '' %>
    [...]
<%= (i % 6) ? '</div>' : '' %>
<% end %>
0 голосов
/ 20 июля 2009

Наиболее похожим на Rails способом было бы использовать помощник content_tag и окружать все данные div, используя специальный класс для 6-го div.

<% @media.each_with_index do |m, i| %>
  <% content_tag(:div, :class => ( (i % 6==0 )? 'six' : 'other')) do %>
    <%= m %>
  <% end%>
<% end %>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...