如何结合两个@objects的迭代?

时间:2016-04-28 00:25:30

标签: ruby-on-rails ruby

如何将<% @notes.each do |note| %>合并到@challenge.dates_challenged.first(@challenge.days_challenged).each_with_index do |date, i| %>中,以便挑战/展示中的条件有效?

因为现在每个音符都会多次呈现音符/表格。

挑战/显示

<% @challenge.dates_challenged.first(@challenge.days_challenged).each_with_index do |date, i| %>
  <% @notes.each do |note| %> # How to incorporate this iteration into above iteration?
    Day <%= i + 1 %>
    <% if note.notes_date.strftime("%m/%d/%y") == date.strftime("%m/%d/%y") %> # If note is created on date then show note else show form
      <%= note.notes_text %>
    <% else %>
      <%= render 'notes/form', :date => date %>
    <% end %>
  <% end %>
<% end %>

这是因为有两次迭代而不是两者的组合。我不知道如何将两者结合起来,以便迭代适用于在date上创建注释然后显示<%= note.notes_text %>其他显示注释/表单的情况。

1 个答案:

答案 0 :(得分:2)

当尝试在Ruby中排列两个不同的数据结构时,您可以使用大量工具。其中一个更方便的是能够将一系列事物转换为字典,即哈希,您可以通过一些任意属性快速查找它们。

例如:

<%- notes_for_date = @notes.group_by(&:note_date) -%>

然后您可以在任何给定日期显示备注:

<%- if notes_for_date[date].any? %> 
  <%- notes_for_date[date].each do |note| -%>
    <%= note.notes_text %>
  <%- end -%>
<% else %>
  <%= render 'notes/form', :date => date %>
<% end %>

您似乎有点模糊的一点是像@notes这样的集合是一个数组或类似数组的结构,直接调用note_text方法是不可能的。

如果你想获得所有这些值,你可以这样做:

note_texts = @notes.collect(&:note_text).join

它具有拉出所有音符并将它们组合成单个字符串的效果。

在学习它时首先尝试掌握Ruby的东西是理解如何将您拥有的数据转换为您需要的形式,或者更接近您最终需要的形式,并逐步解决它。 Enumerable库充满了非常方便的工具,我建议您在任何空闲时间查看它,您必须了解可用工具的广度和深度。