Rails在循环记录集时跳过nil对象

时间:2016-07-18 07:09:24

标签: ruby-on-rails ruby ruby-on-rails-4

嗨,我想知道是否有人能告诉我一个更优雅的方式来做下面的事情。

我有一个记录集,其中嵌套值可能包含也可能不包含在内,我正在努力显示信息,同时循环显示空值,接收nil错误时不存在。

我知道我可以通过先检查来修复它,只是想知道是否应该有一种我不知道的清洁方式。

当前代码:(儿童可能包括也可能不包括在内)

@bookings.each do |booking|
  <tr>
    <td><%= booking.name %></td>
    <td><%= booking.parent.name %></td>
    <td><%= booking.child.name %></td>
  </tr>

潜在的解决方法。

@bookings.each do |booking|
  <tr>
    <td><%= booking.name %></td>
    <td><%= booking.parent.name %></td>
  <% if !booking.child_id.nil? %>
    <td><%= booking.child.name %></td>
  <% end %>
  </tr>

提前致谢。

4 个答案:

答案 0 :(得分:2)

上面的解决方法打破了表格布局(表格数据单元格的数量应该在每一行中相同,或者应该涉及有点colspan。)。有人可能会使用标准导轨方法#try

@bookings.each do |booking|
  <tr>
    <td><%= booking.name %></td>
    <td><%= booking.parent.name %></td>
    <td><%= booking.child.try(:name) %></td>
  </tr>

另一种方法是在没有找到孩子的情况下打印更具描述性的内容:

@bookings.each do |booking|
  <tr>
    <td><%= booking.name %></td>
    <td><%= booking.parent.name %></td>
    <td><%= booking.child && booking.child.name || 'N/A' %></td>
  </tr>

答案 1 :(得分:2)

如果您使用的是Ruby2.3,则可以使用the safe navigation operator &.来获得更优雅的效果。

@bookings.each do |booking|
  <tr>
    <td><%= booking.name %></td>
    <td><%= booking.parent.name %></td>
    <td><%= booking.child&.name %></td>
  </tr>

请参阅:http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/

答案 2 :(得分:1)

你应该读一下ruby .try()。在你的情况下,这应该工作

<% @bookings.each do |booking| %>
    <tr>
       <td><%= booking.name %></td>
       <td><%= booking.parent.name %></td>
       <td><%= booking.child.try(:name) %></td>
    </tr>
<% end %>

作为替代方案,您可以使用Rescue

<%= booking.child.name rescue nil %>

答案 3 :(得分:0)

使用NullObject模式,以防止将来出现重复。 这样的事情。

class Booking
  def child
    super || NullChild.new
  end
end

class NullChild
  def name
  end
end