2

Array/Setのようなオブジェクトまたはハッシュの引数を受け入れるメソッドがあります。メソッドの要点は次のようなものです。

def find(query = {})
  if Array === query or Set === query
    query = {:_id => {'$in' => query.to_a}}
  end
  mongo_collection.find(query)
end

このメソッドはIDオブジェクトのセットを受け入れ、それをMongoDBのハッシュ条件に変換します。

上記のコードに関する2つの問題:

  1. 標準ライブラリから「set」が必要ない場合は失敗します。チェックを実行するためだけに依存関係を要求したくありません。
  2. 厳密な型比較はしたくありません。配列またはセットのような値を受け入れ、それを。を使用して値の配列にキャストしたいと思いますto_a

このチェックをどのように実行しますか?覚えておくべきいくつかの考慮事項:

  1. メソッドを確認できましto_aryたが、Setが応答しませんto_ary。このメソッドを実装するオブジェクトは基本的に配列である必要があり、Setは基本的に配列ではないことに同意します。Rubyでto_intとto_strを実装した結果を参照してください。
  2. to_aハッシュが応答するので確認できません
  3. ArrayとSetに共通しているが、Hashには共通していないメソッドは次のとおりです。

    [:&, :+, :-, :<<, :collect!, :flatten!, :map!, :|]
    

私はこのようなもので行くことにしました:

query = {:_id => {'$in' => query.to_a}} if query.respond_to? :&

交差点は、集合のようなオブジェクトが持つ演算子である可能性が高いためです。しかし、これについてはよくわかりません。

4

4 に答える 4

4

これが私の見解です:

if not Hash === query and query.respond_to? :to_a

興味がある唯一のメソッドであるをチェックしているだけto_aでなく、それがハッシュオブジェクトではないことも確認しています。私はハッシュに対して厳密な型チェックを使用していますが、これは基本的にハッシュである完全に別個のクラスとして渡される可能性が最も低いオブジェクトであるためです。

于 2011-07-20T21:06:55.120 に答える
1

クエリがハッシュのようなものかどうかを調べてみてはどうでしょうか。

def find(query = {})
  query = {:_id => {'$in' => query.to_a}} unless query.respond_to?(:has_key?)
  mongo_collection.find(query)
end

オブジェクトがhas_key?に応答する場合のように、オブジェクトがハッシュまたはハッシュになると予想するのは合理的です。

于 2011-07-21T03:07:02.700 に答える
0

Setが定義されているかどうかを確認すると、最初の問題が解決します。2つ目は、クエリのクラスの祖先をチェックして、配列が含まれているかどうかを確認することもできますが、すべての「配列のような」オブジェクトをキャッチできるとは限りません。動作ではなく名前をテストしているので、配列性をテストするメソッドの存在をチェックしないでしょう。特にArelは&に応答します(または非推奨になる前に応答しました)が、このタイプのオブジェクトは期待どおりに機能しません。

于 2011-07-20T20:56:13.127 に答える
0

個人的に考えているのは...

def find(query = {})      
  mongo_collection.find(query_formatter(query))
end

def query_formatter(query)
  if query.respond_to?(:to_a) && !query.kind_of?(Hash)
    {:_id => {'$in' => query.to_a}}
  else
    query
  end
end
于 2011-07-20T22:30:21.027 に答える