如何通过公共属性将两个数组合并为一个?

How can I combine two arrays into one by a common attribute?

如何将两个数组合并为一个,例如...

Day 1: Notes/form
Day 2: Notes/form
Day 3: Notes/form
Day 4: Notes/form
Day 5: Notes/form

如果用户随后在第 3 天创建了一条笔记,它看起来像...

Day 1: Notes/form
Day 2: Notes/form
Day 3: Notes/notes
Day 4: Notes/form
Day 5: Notes/form

下面的代码怪兽试图实现上述目标,但迭代全部关闭。例如,如果在第 1 天和第 3 天创建了一条注释,那么输出将类似于...

Day 1: Notes/notes # Shows both Day 1 and Day 3 note. Only want to show Day 1 note
Day 1: Notes/form
Day 2: Notes/form
Day 2: Notes/form
Day 3: Notes/notes # Shows both Day 1 and Day 3 note. Only want to show Day 3 note
Day 3: Notes/form
Day 4: Notes/form
Day 4: Notes/form
Day 5: Notes/form
Day 5: Notes/form

challenges/show

<% @challenge.dates_challenged.first(@challenge.days_challenged).each_with_index do |date, i| %>
  <% @notes.each do |note| %>
    Day <%= i + 1 %>
    <% if note.notes_date.strftime("%m/%d/%y") == date.strftime("%m/%d/%y") %>
      <%= render 'notes/notes' %>
    <% else %>
      <%= render 'notes/form', :date => date %>
    <% end %>
  <% end %>
<% end %>

总而言之,用户创建了一个挑战。挑战具有属性 days_challenged。用户选择挑战的天数,即 10、15、30 等。对于这些天中的每一天,我都想显示一个 notes/form。如果用户随后在某一天输入了一条注释,则显示页面上的 notes/form 应替换为该注释(任何一天都不应有多个与之关联的注释)。

您在用于查找当天笔记的循环中做的太多了。这应该是正确的:

<% @challenge.dates_challenged.first(@challenge.days_challenged).each_with_index do |date, i| %>
  Day <%= i + 1 %>
  <% if @notes.any? { |note| note.notes_date.strftime("%m/%d/%y") == date.strftime("%m/%d/%y") } %>
    <%= render 'notes/notes' %>
  <% else %>
    <%= render 'notes/form', :date => date %>
  <% end %>
<% end %>

这个观点还是太有逻辑了

  1. 正如 photoionized 评论的那样,如果 @notes 是一个 Hash,其键是 Date,其值是 Notes,那会更容易。然后,您可以用散列查找替换 any?
  2. 我不清楚你为什么需要比较 strftime("%m/%d/%y")。您应该能够比较 Dates。 (如果你不能这样做是因为他们处于不同的时区或其他原因,请考虑解决这个问题——它会在你的整个应用程序中造成混乱。)
  3. 我将 dates_challenged.first(@challenge.days_challenged) 提取到 Challenge 上名为 current_dates_challenged 的方法中,并在视图中使用它。