2

Rails 2.3.4 アプリと次のような行があります。

temp = Rails.cache.fetch(:temp_id) { User.find_by_name('Temp').id } 

environment.rb に以下を追加して、キャッシュ層を memcached に切り替えることにするまで、すべてがうまくいきました。

config.cache_store = :mem_cache_store

以前は正常に機能していた行で、次のエラーが表示されます。

 undefined method 'length' for :temp_id:Symbol           

/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb:645:in 'get_server_for_key'

私はエラーを理解していますが、この一般的なケースは Rails のテスト ケースによってすぐに発見されると思います。それ以外の場合は、この問題にモンキーパッチを適用して、シンボルを文字列に変換できると確信しています。

ありがとう

4

2 に答える 2

2

可能であれば、文字列キーを使用してください。ドキュメントの例はすべて、文字列キーを使用しています。私が見る限り明示的に言及されていませんが、他のキーはサポートされていません。

キー引数はキャッシュの実装に直接渡されるため、文字列以外のものを受け入れるかどうかについて、さまざまなキャッシング フレーバーが一致しない場合があります。

メモリ内キャッシュを除いてキャッシュは外部にあるため、シンボルのサポートがあなたのようなケースを防ぐこと以外に役立つかどうかはわかりません。キーは実際にはどこかの出力に書き込まれるため (Ruby アプリの内部だけではありません)、概念的にはキーは文字列である必要があります。

コメントに応じて編集:はい、もちろん可能であり、この場合、すべての呼び出しを変更する必要を回避するためにモンキー パッチを作成することは完全に合理的です。あなたが提案しているのはこれです(読みやすくするために回答にコピーされています):

class MemCache
  def get_server_for_key_with_symbols(key, options = {})
    key = key.to_s if key.is_a? Symbol
    get_server_for_key_without_symbols(key, options)
  end
  alias_method_chain :get_server_for_key, :symbols
end

\.fetch(:\w+)また、プロジェクト全体の検索と置換を行い、それを(必要に応じ\.fetch("$1")て繰り返します) に置き換えることも検討します。これはおそらくすべてのケースの 95% をカバーし、その後のテスト スイートの実行で残りのエラーをキャッチするはずです。readwrite

一般的に:最近の Rails のドキュメントはかなり充実していますが、残念ながら多くの仮定は依然として暗黙的です。一般に、ドキュメントに記載されている例をよく見て、同じスタイルを使用することをお勧めします。文書化された例は常に、フレームワークがどのように使用されることを意図していたかを示しています。

于 2010-02-25T07:36:57.920 に答える
-2

FWIW、それは正規に Rails.cache.read と Rails.cache.write です。

于 2010-03-07T07:46:45.097 に答える