【问题标题】:How to combine iteration of two @objects?如何组合两个@objects的迭代?
【发布时间】:2016-04-28 00:25:30
【问题描述】:

如何将<% @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 上创建注释,则显示 &lt;%= note.notes_text %&gt; 否则显示注释/表单。

【问题讨论】:

  • 您的 Note 模型如何与您的日期相关联?不清楚为什么要比较两个格式化的日期,因为比较 Date 和 Date 就足够了。
  • 我将notes_datedate 进行比较,因为notes_dateNote 的一个属性,而date 是从days_challenged 的属性派生自Challenge @tadman。我想为用户挑战的每一天显示一个注释或注释/表格。如果注释是为那一天创建的,那么注释应该显示,否则注释/表格应该显示。

标签: ruby-on-rails ruby


【解决方案1】:

当尝试在 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 库中有很多非常方便的工具,我鼓励您在任何空闲时间都仔细阅读,以了解可用工具的广度和深度。

【讨论】:

  • 再次感谢塔德曼!我一直在玩你的答案,但你从哪里得到[date]?我想留下&lt;% @challenge.dates_challenged.first(@challenge.days_challenged).each_with_index do |date, i| %&gt;,因为那样会导致undefined method 'any?' for nil:NilClass
  • 你可以notes_for_date.each |date, notes| 来遍历日期。
  • &lt;% @notes_for_date.each do |date, notes| %&gt; &lt;% if @notes_for_date[date].any? %&gt; &lt;% @notes_for_date[date].each do |note| %&gt; &lt;%= note.notes_text %&gt; &lt;% end %&gt; &lt;% else %&gt; &lt;%= render 'notes/form', :date =&gt; date %&gt; &lt;% end %&gt; &lt;% end %&gt; 就这样?然后我将@notes_for_date = @notes.group_by(&amp;:notes_date) 放入控制器中。现在,如果只有一个音符存在,所有表格都会消失
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 2021-09-29
  • 2012-04-24
相关资源
最近更新 更多