2016-07-18 9 views
0

こんにちは私は誰かが私に以下のやり方をよりエレガントに表示できるかどうか疑問に思っていました。Railsレコードセットをループしながら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> 

感謝。

答えて

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> 
+0

最初の解決策では、 'child'オブジェクトが' booking'に対して存在しない場合はどうなりますか? – titan

+0

@titan 'booking.child'は' nil'を返し、 'child'の' try'は 'nil'も返します。 – mudasobwa

+0

ああそう!私の悪い、 'name'が' nil'で呼び出されたときにエラーが発生します。ありがとう。 – titan

1

あなたはルビー.try()についてお読みください。あなたのケースでは、これはあなたがRuby2.3を使用している場合は、レスキュー

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

'': 'child'は意味がありません。' booking'が 'nil'ならば、2行上にエラーが発生します。 – mudasobwa

+0

@Stewartは明示的に ':child'をインクルードしているかもしれないし、インクルードしようとしているかもしれません。子: – titan

+0

' try'の仕組みを誤解しています。 – mudasobwa

2

を使用することができます別の方法として

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

を動作するはずです、あなたはよりエレガントなため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/

0

使用NullObjectパターン、将来的には重複を防ぐために。 このようなものです。

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

class NullChild 
    def name 
    end 
end 
関連する問題