【问题标题】:Ruby loop issuesRuby 循环问题
【发布时间】:2010-12-22 01:53:42
【问题描述】:

我似乎无法让这个循环正常工作

@mr = MediaRating.where("user_id = ?", session['user_credentials_id'])

unless @mr.empty?
  @mr.each do |rating|
    @m = Media.where("id = ?", rating.media_id)

    @m.each do |m|
      @history << m
    end
  end
end

在 MediaRating 表中只有 3 行测试数据,但是当我在屏幕上输出数据时,@history 数组包含 9 个条目。我知道这与我在循环中做错了什么有关,但无法弄清楚。

工作代码

查看:

<!-- For Each -->
<% unless @history.empty? %>
  <% @history.each do |m| %>
    <tr class="control_result_row">
      <td class="control_result"><%= m.first.title %></td>
      <td class="control_result">Russian</td>
    </tr>
  <% end %>
<% else %>
  <tr class="control_result_row">
    <td class="control_result" colspan="2">You have no ratings logged</td>
  </tr>
<% end %>
<!-- End For Each -->

控制器:

@mr = MediaRating.where("user_id = ?", session['user_credentials_id'])
@mr.each do |rating|
  @m = Media.where("id = ?", rating.media_id)
  @history << @m
end

【问题讨论】:

  • 媒体包含什么?检查嵌套 Media.where 调用后 @m 包含的内容
  • 回复:您的 ERB 嵌入了 unless/else 逻辑。当我进行代码审查或处理其他人的代码时,我不希望在代码中看到这种组合。当我破译unless 中隐含的not 时,我发现这个组合让我的大脑向下移动以弄清楚发生了什么。请参阅 John Nunemaker 的 "Unless, The Abused Ruby Conditional" 文章。

标签: ruby arrays loops


【解决方案1】:

Media 表中有多少东西?如果每个 MediaRating 返回 3 个东西,那么您的循环就可以了。

另外,unless @mr.empty? 也不需要,因为如果@mr 为空,each 块将什么也不做。

我想这就是你所需要的:

@mr = MediaRating.where("user_id = ?", session['user_credentials_id'])
@mr.each do |rating|
    @m = Media.where("id = ?", rating.media_id)
    @history << @m
end

如果id 是键,@m = Media.where("id = ?", rating.media_id) 应该只返回一件事。

【讨论】:

  • MediaRating 表中有 3 个项目(目前用于测试目的),但 Media 表中有 100 个项目
  • @history 应该包含什么? MediaMediaRatings
  • 另外,感谢关​​于除非语句的提示,仍在尝试学习 ruby​​
  • 感谢您的帮助!我在上面添加了我的工作代码......这是我试图将一个数组传递给一个部分的 :collection 的问题......就像我说的仍在尝试学习 Ruby/Rails :)
【解决方案2】:

我认为您在 @history 数组中添加了错误的值。 如果您想要 mediaRating 历史记录,您应该正确添加媒体评级。

@history << mr

或者它看起来像一个数据问题。验证外键依赖关系。

【讨论】:

  • 好吧,我需要将@m 中的值添加到历史数组中。我需要遍历每个 MediaRating 来搜索 Medias DB
  • 你能在每秒钟添加一个打印,看看它执行了多少次。添加一些也会有帮助的数据点。由于有 100 种媒体,请在迭代之前检查 @m 的大小。你能把第二个中的变量名改成 |media| 之类的吗? ??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2014-05-23
  • 2018-11-05
  • 2011-09-13
相关资源
最近更新 更多