我有一个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测试用例发现,所以我想知道我是否做错了。否则,我确信我可以将这个问题单个化,将符号转换为字符串。
由于
答案 0 :(得分:2)
如果可以,只需使用字符串键即可。所有documentation examples都使用字符串键。虽然我没有明确提到它,但是不支持其他键。
关键参数直接传递给缓存实现,因此不同的缓存风格可能不同意它们是否接受除字符串以外的任何内容。
因为除了内存缓存之外,缓存是外部的,我不确定支持符号除了防止像你这样的情况之外还有用。密钥实际上会被写入某个输出(它不仅仅是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")
(必要时重复read
和write
)。这可能应该覆盖所有情况的95%,并且随后运行的测试套件应该能够捕获其余的错误。
一般来说:虽然Rails的文档目前相当不错,但遗憾的是很多假设仍然存在。一般来说,好好了解文档中给出的示例,并使用相同的样式。记录的示例始终是如何使用框架的。
答案 1 :(得分:-2)
FWIW,它的规范是Rails.cache.read和Rails.cache.write。