рельсы - при использовании Group_by - Как получить индекс? - PullRequest
8 голосов
/ 13 февраля 2011

У меня есть следующее:

sets = DataSet.all.group_by{ |data| [data.project_id, "-", data.thread_id].join(" ") }

<% sets.each do |range, datas| %>
  <p><%= range %>:</p>
  <% datas.each do |data| %>
     <%=data%>
    <p>Last Post<%= data.last.created_at %></p>
  <% end %>
<% end %>

Проблема в том, что мне нужен индекс.Поэтому я обновил вышеупомянутое с помощью:

<% sets.each_with_index do |range, datas, i| %>
  <p><%= range %>:</p>
  <% datas.each do |data| %>
     <%= i %>
     <%=data%>
    <p>Last Post<%= data.last.created_at %></p>
  <% end %>
<% end %>

Это затем ломается с ошибкой: неопределенный метод `last 'для 0: Fixnum

Идеи?спасибо

1 Ответ

15 голосов
/ 13 февраля 2011

Проблема, которую вы наблюдаете, связана с тем, как параметры назначаются блоку.Во втором примере вы заметите, что range содержит массив, содержащий один range и соответствующий datas, переменная datas содержит индекс, а i всегда nil.

Это потому, что ruby ​​"распускает" массивы, если это единственный параметр блока.Если у вас более одного типа (в данном случае это массив и целое число), вы должны указать ruby, что он должен делать.Самый простой способ - использовать круглые скобки.

<% sets.each_with_index do |(range, datas), i| %>
  ...
<% end %>

Таким образом, ruby ​​поймет, что вы имеете в виду, и разбит массив на range и datas.Это на самом деле особенность оператора присваивания ruby ​​в сочетании с оператором запятой.Работает так

my_array = [1, 2]
(x, y) = my_array
p x                # prints 1
p y                # prints 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...