优雅地跳到下一条记录 - ActiveRecord

时间:2015-08-06 22:10:41

标签: ruby-on-rails activerecord

Rails 3.2

我认为我有以下内容:

<% @organizations.each do |o| %>
  <% organization = Organization.find(o.organization_id)  %>
    <% if organization == nil %>
      <% next %>
    <% end %>
  <tr>
    <td><%= o.org_name %></td>
    <td><%= number_to_currency(o.revenue, :precision => 0) %></td>
    <td><%= o.rank %></td>
  </tr>
<% end %>

我的印象是,如果找不到组织,执行将跳转到下一条记录。相反,我得到了&#34;出了问题&#34;。

查看日志文件,组织表中找不到organization_id之一,这是触发错误的原因。

为什么执行没有跳到下一条记录?

临时解决方案:我改变了

<% organization = Organization.find(o.organization_id)  %>

要:

<% organization = Organization.find_by_id(o.organization_id)  %>

当它找不到任何东西时,这给了我一个零。如果它为零,则执行跳到下一条记录

1 个答案:

答案 0 :(得分:2)

根据http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-findOrganization.find(o.organization_id)会为表格中不存在的ID引发ActiveRecord::RecordNotFound

附录:

尝试以下内容:

<% ids = @organizations.map(&:organization_id) %>
<% organizations = Organization.where(id: ids) %>
<% organizations.each do |o| %>
    <tr>
        <td><%= o.org_name %></td>
        <td><%= number_to_currency(o.revenue, :precision => 0) %></td>
        <td><%= o.rank %></td>
    </tr>
<% end %>

使用此方法,您将从DB获取所有具有1个查询的组织,而不是每个组织获取1个。