【问题标题】:Determine index of element in Array.each确定 Array.each 中元素的索引
【发布时间】:2012-07-26 17:58:58
【问题描述】:

我正在尝试以三行的形式呈现大量内容。但是,我不确定如何使用 Ruby 确定元素的当前位置。这就是我所拥有的:

<% Animals.each do | animal | %>
    <%= animal.species %>
<% end %>

我希望能够添加一个&lt;BR&gt;,或者如果我在渲染一张桌子时,每次我们击中集合中的第三只动物时,&lt;/TR&gt;&lt;TR&gt;。当然,如果元素的数量nE 不能被三整除,那么该表的格式就会不正确。我想通过在迭代后进行一些检查,我可以关闭它。

但是有没有办法获取在Array.each 方法中被迭代的元素的索引?我有强烈的预感,我可以做到以下几点:

<table>
<% Animals.each do | animal | %>
<% if Animals.find_index(animal) / 3 == 0 %>
   <tr>
<% end %>
       <td><%= animal.species %></td>
<% if Animals.find_index(animal) / 3 == 2 %>
   </tr>
<% end %>
</table>

我唯一的事情是 AnimalActiveRecord::Base 的子类,所以我不确定(还没有看过)这是否会很好地扩展,更不用说每次调用 find_index 是否会一种超级密集的方法。欢迎提出任何建议。

【问题讨论】:

  • 我正在使用 Ruby 1.9.3,根据apidock.com/ruby/Enumerable/Enumerator/each_with_index,该方法在该版本中不可用。但是,这本来可以完成工作!
  • 该方法可用。它只是movedEnumerable 的不同部分,并且由于Array 继承自它,该方法仍然可用于Array

标签: ruby arrays ruby-on-rails-3 ruby-on-rails-3.1 each


【解决方案1】:

你需要

<% animals = Animals.all %>
<table>
<% animals.in_groups_of(3) do |animal_row| %>
  <tr>
    <% animal_row.compact.each do |animal| %>
      <td><%= render animal %></td>
    <% end %>
  </tr>
<% end %>
</table>

应该大致完成这项工作。

更重要的是,作为一名 Ruby 开发人员,我认为将 Enumerable 模块的文档放在手边对我来说非常棒。它是我“最喜欢”的模块,几乎总是能帮助我轻松解决棘手的问题。

【讨论】:

  • 谈谈快速回复!谢谢!
  • 请注意我是如何在内循环中使用紧凑的。至关重要的是,最后一组 3 可能不包含恰好 3 个元素(当总元素不能被 3 整除时)。最后一组用 nil 填充,压缩最后发送的数据可以避免出现 nil 错误。
  • 我正要问为什么,但你读懂了我的想法!再次感谢您:D
  • 我抢先了你的问题:)
  • 差别不大,但是,animals.in_groups_of(3, false) 会去掉多余的 nil,这样你以后就不必使用 compact了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多