2012-01-01 5 views
2

ネストされたMashesがたくさんある大きなMashオブジェクトがあります。私が得たいデータのいくつかは、次のようないくつかのレイヤーです:ネストされたハッシュでnilをチェックする最も効果的な方法は何ですか?

phone = profile.phone_numbers.all.first.phone_number 
title = profile.positions.all.first.title 

ただし、phone_numbersまたはpositionsはゼロまたは空白にすることができます。各レベルをチェックしなくても、最も効果的なゼロチェックの方法は何ですか?使用する一般的なテクニックはありますか?

+0

をいいえ、それは実際にマッシュです。私はそれが私の構文はドット演算子を使用するためにのみ言及します。 http://rubygems.org/gems/mash – James

+0

ああ、それについて知りませんでした。クール。 –

答えて

4

Ickさんのmaybeはあなたを助けることです!

phone = maybe(profile) {|p| p.phone_numbers.all.first.phone_number} 

# or like this. 
phone = profile.maybe.phone_numbers. 
       maybe.all. 
       maybe.first. 
       maybe.phone_number 

それとも、簡単な解決策を好むことができます:Object#andand

はこのようにそれを使用してください。それは同様の方法で機能する。

phone = profile.andand.phone_numbers. 
       andand.all. 
       andand.first. 
       andand.phone_number 
+0

多分とおそらく違いますか? – James

+0

あなたの立場では、いいえ。それらは同様の方法で機能する。このコメントを投稿している間に投稿を更新しました。 :-) –

2

重要なことは、中間値がnilの場合に起こりたいことです。割り当てられた値をnilまたは別の値にしますか?処理を続行するか、エラーを停止または発生させますか?

nilを代入することは許容されている場合は、回線にrescue nil句を追加することができます。

phone = profile.phone_numbers.all.first.phone_number rescue nil 
title = profile.positions.all.first.title rescue nil 

変数に代入されますnilを、返し、処理が続行されます。介入する方法や値がゼロであれば、あなたがそれを知っていると良いかもしれないので、それにはいくつかのリスクがあります。通常は、何も実行される前に何かが正しく割り当てられていなかったことを意味し、救助はそれをあいまいにし、デバッグをより困難にします。

あなたは続けますが、続行する前に反応する機会を持って、標準の救助ブロックを使用する場合:

begin 
    phone = profile.phone_numbers.all.first.phone_number 
rescue Exception => e 
    STDERR.puts "Exception handled: #{ e }" 
    phone = nil 
end 
関連する問題