【问题标题】:How can I combine two arrays into one by a common attribute?如何通过一个共同的属性将两个数组合并为一个?
【发布时间】:2016-08-29 00:24:45
【问题描述】:

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

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

挑战/表演

<% @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_for_date = @notes.group_by(&amp;:note_date) 的东西?我无法让它在视图中工作,尽管@photoionized

标签: ruby-on-rails ruby iteration each polymorphic-associations


【解决方案1】:

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

<% @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,其键为 Dates 并且其值为 Notes,这将更容易。然后,您可以将 any? 替换为哈希查找。
  2. 我不清楚为什么需要比较 strftime("%m/%d/%y")。你应该可以比较Dates。 (如果您因为它们位于不同的时区或其他原因而无法做到这一点,请考虑修复它 - 这会导致整个应用程序混乱。)
  3. 我会将dates_challenged.first(@challenge.days_challenged) 提取到Challenge 上名为current_dates_challenged 的方法中,然后在视图中使用它。

【讨论】:

  • 太棒了!当创建多个笔记时,这消除了笔记/表单的多重渲染。仍然每天显示多个笔记。因此,就像在第 1 天一样,显示第 1 天和第 3 天的注释,而只有第 1 天的注释应该显示在当天。也许你可以帮助指导我。在笔记/笔记中我有&lt;% @notes.each do |note| %&gt; &lt;%= note.notes_text %&gt; &lt;% end %&gt;。在challenge_controller def show 我有@notable = @challenge @notes = @notable.notes @note = Note.new
  • 更好的edit it in to the question,或者可能问一个新的。塞进评论太难了。
  • 好吧,戴夫,我提出了一个新问题:] 希望你也能在这里帮助我:stackoverflow.com/questions/37013995/… 非常感谢!
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多