1

私が使用しているSavongemは、単一のオブジェクトまたは配列を返します。SOAP応答が返されるまで、どちらになるかを知る方法はありません。

nil便宜上、応答をに変換し[]、単一の応答をに変換し[obj]、配列を配列のままにしておきたいと思います。これは、で簡単に行うことができますKernel#Array

> Array nil
=> [] 
> Array 1
=> [1] 
> Array [1,2,3]
=> [1, 2, 3] 

ただし、をKernel#Array呼び出すため、どのオーバーライドto_aに対して失敗します。Hashto_a

> Array({a: 1})
=> [[:a, 1]]
> Array([{a: 1}, {b: 2}])
=> [{:a=>1}, {:b=>2}]

上記の2行目で見たい[{:a=>1}]です。

4

5 に答える 5

3

ActiveSupport を使用している場合は、次のことができます。

> Array.wrap({a: 1})
=> [{:a, 1}]
> Array.wrap([{a: 1}, {b: 2}])
=> [{:a=>1}, {:b=>2}]
于 2012-07-24T22:46:03.587 に答える
2
>> [nil].compact.flatten(1)
=> []
>> [1].compact.flatten(1)
=> [1]
>> [{a: 1, b: 2}].compact.flatten(1)
=> [{:a=>1, :b=>2}]
于 2012-07-24T23:02:23.427 に答える
1

Hash#to_a現在、私は自分のstraight_to_a方法でバイパスすることができます:

def straight_to_a(o)
  o.kind_of?(Array) ? o : [o].compact
end

したがって:

> straight_to_a nil
=> [] 
> straight_to_a 1
=> [1] 
> straight_to_a( {a: 1} )
=> [{:a=>1}]

もっと簡単な方法があるといいのですが?

于 2012-07-24T16:00:52.587 に答える
1

別のポスターは、Active Support の使用を提案しました。1 つのメソッドだけのためにプロジェクトに余分な依存関係を追加したくない場合は、Active Support のソース コードを次に示しますArray.wrap

class Array
  def self.wrap(object)
    if object.nil?
      []
    elsif object.respond_to?(:to_ary)
      object.to_ary || [object]
    else
      [object]
    end
  end
end

このコードを自分のファイルutilities.rbまたはcore_extensions.rbファイルに簡単に追加して、プロジェクトに含めることができます。

于 2012-07-24T23:06:57.117 に答える
0

flattenあなたの解決策は問題ないようです。おそらく、に基づいて何かを試すことができます

def straight_to_a *ary
  ary.flatten(1)
end
于 2012-07-24T17:03:01.890 に答える