31

YAMLファイルからいくつかの設定をロードしている非Railsプロジェクトがあります:

config = YAML::load(File.open("#{LOG_ROOT}/config/database.yml"))

config["host"]このハッシュには、config["username"]などのようにしかアクセスできません。

:hostとの両方を使用できるように、無関心なアクセスが必要です"host"

その理由は、このハッシュを渡したプロジェクトのgemの1つがシンボルを使用してアクセスしているようで、現在失敗しているためです。

このシナリオで無関心なアクセスを持つハッシュを作成するための最良の方法は何ですか?

4

2 に答える 2

53

Active Support gemをインストールすると、数kBのディスク容量以外は何も失われません。コードでは、必要な関数のみが必要です。

require 'active_support/core_ext/hash/indifferent_access'

そうすれば、名前空間を台無しにするものが他にないことを確認できます。

于 2012-05-28T09:01:10.053 に答える
19

構成ハッシュがキーの文字列化されたバージョンの値を返すようにします。

config = {"host"=>"value1", "Username"=>"Tom"}
config.default_proc = proc{|h, k| h.key?(k.to_s) ? h[k.to_s] : nil}
p config[:host] #=> "value1"

default_procハッシュにキーが見つからない場合は毎回実行されます。これは無関心なアクセスの半分にすぎないことに注意してください。キーが存在config["host"]する場合はnilになります。:hostそれも機能する必要がある場合:

config.default_proc = proc do |h, k|
   case k
     when String then sym = k.to_sym; h[sym] if h.key?(sym)
     when Symbol then str = k.to_s; h[str] if h.key?(str)
   end
end

このアプローチの制限についてのコメントを参照してください(tltr:との個別の値は可能で:aあり、その他'a'は考慮されませんHash.delete)。

于 2012-05-28T14:51:52.603 に答える