6

以前にこれに対するエレガントな解決策を見たことがあると確信していますが、それを見つけることができません:

次のハッシュ要素を持つ場合と持たない場合があるRailsコントローラーがあります。

myhash[:parent_field]

その親フィールド内では、子要素も空白になる可能性があります。私は現在、(非常に醜い)方法でそれをチェックしています:

if (!myhash[:parent_field] || !myhash[:parent_field][:child_field] || myhash[:parent_field][:child_field].blank?)

これはうまくいきますが、確かに、もっとエレガントな方法が必要だと思います。繰り返しますが:

  • myhash[:parent_field] が存在する場合と存在しない場合があります
  • 存在する場合、 myhash[:parent_field][:child_field] は存在する場合と存在しない場合があります
  • それが存在する場合、空白である場合とそうでない場合があります。
4

6 に答える 6

9

#fetchあなたの友達です:

my_hash.fetch(:parent, {})[:child].blank?
于 2012-04-28T01:29:46.773 に答える
3

私がすることは、ローカル変数を使用して負担を軽減することです。

unless (p=foo[:parent]) && (c=p[:child]) && !c.blank?
  # Stuff is borked!
end

しかし、楽しみのために、代替案を探ってみましょう…


データ構造を変更できない場合 (ちなみに、これは配列ではなくハッシュです)、Ruby のandand gem を Rails と組み合わせて使用​​することで、オブジェクトtryである可能性のあるものに対してメソッドを呼び出す怠惰な方法として使用できnilます。


または、データ構造を、存在しないキーを要求したときに空の自動有効化ハッシュを返すハッシュに変更することもできます。

mine = Hash.new{ |h,k| Hash.new(&h.default_proc) }
mine[:root] = { dive:42 }
p mine[:root][:dive]        #=> 42
p mine[:ohno][:blah][:whee] #=> {}
p mine[:root][:blah][:whee] #=> undefined method `[]' for nil:NilClass (NoMethodError)

ただし、階層内のすべてのオブジェクトがこれらのハッシュの 1 つであることを確認する必要があります (のコンテンツに対して明示的に失敗したため:dive、エラーが発生しました)。


別の楽しみとして、独自のマジック ルックアップ メソッドを追加することもできます。

class Hash
  def divedive(*keys)
    obj = self
    keys.each do |key|
      return obj unless obj && obj.respond_to?(:[])
      obj = obj[key]
    end
    obj
  end
end

if myarray.divedive(:parent,:child).blank?
  # ...
于 2012-04-27T22:57:49.897 に答える
1

これはよくある質問であり、おそらく

そのリストの最初のものは、他の 2 つの重複として閉じられましたが、私の答えは、後の 2 つよりも、この問題に対処するための手法をより包括的にカバーしていると思います。

于 2012-04-28T00:16:56.230 に答える
0

おそらく実際のニーズによって異なりますが、これに対する OOP アプローチは、配列とハッシュを実際のオブジェクトに変換することです。各オブジェクトはその関係を管理し (ActiveRecord と同様)、子と親を取得する方法を知っています。

于 2012-04-27T22:57:30.297 に答える
0

nil.blank?isであるためtrue、中間条件を削除して次のように単純化できます。

if !myarray[:parent_field] || myarray[:parent_field][:child_field].blank?

また、ハッシュの呼び出しmyarrayは少し誤解を招きます。

于 2012-04-27T23:50:44.297 に答える
-2

どうですか

!(myarray[:parent_field][:child_field] rescue nil).blank?

?

于 2012-04-27T23:31:22.173 に答える