Ruby on rails 当值为nil时,Rails继续缓存
Rails 3.2.13值为nil时的缓存键。一直在查看文档,以确定是否有任何选项可以设置为停止此行为,但找不到任何选项 当值为nil时,是否有任何方法阻止Rails缓存键Ruby on rails 当值为nil时,Rails继续缓存,ruby-on-rails,ruby,Ruby On Rails,Ruby,Rails 3.2.13值为nil时的缓存键。一直在查看文档,以确定是否有任何选项可以设置为停止此行为,但找不到任何选项 当值为nil时,是否有任何方法阻止Rails缓存键 1.8 :001 > value = nil => nil 1.8 :002 > Rails.cache.fetch('foo'){value} => nil 1.8 :003 > value = true => true 1.8 :004 > Rails.cache.f
1.8 :001 > value = nil
=> nil
1.8 :002 > Rails.cache.fetch('foo'){value}
=> nil
1.8 :003 > value = true
=> true
1.8 :004 > Rails.cache.fetch('foo'){value}
=> nil
不确定是否理解问题所在,将忽略零值:
Rails.cache.fetch('foo') { nil }
Cache read: foo
Cache generate: foo
Cache write: foo
=> nil
Rails.cache.fetch('foo'){ "bar" }
Cache read: foo
Cache generate: foo
Cache write: foo
=> "bar"
Rails.cache.fetch('foo'){ nil }
Cache read: foo
Cache fetch_hit: foo
=> "bar"
Rails缓存中没有内置选项来实现这一点,因此我将使用自定义方法来实现您想要的功能,如下所示:
def fetch(key, value)
if Rails.cache.exist?(key)
Rails.cache.read(key)
else
Rails.cache.write(key, value) unless value.nil?
end
end
fetch('foo', nil)
# => nil
fetch('foo', true)
# => true
更新答案:
cache\u nils
选项就是您要寻找的。检查您正在使用的缓存存储,以防它不支持它,但对于dalli_存储
works:
1.8 :001 > value = nil
=> nil
1.8 :002 > Rails.cache.fetch('foo'){ value }
=> nil
1.8 :003 > value = true
=> true
1.8 :004 > Rails.cache.fetch('foo', cache_nils: false){ value }
=> true
我不知道如何阻止它,但这通常是可取的行为。您可能习惯于轻量级本地缓存的行为,例如
@var | |=method
,它使用未初始化的nil
值来表示“尚未缓存”,但该方法无法缓存nil
或false
值。更通用的缓存应该缓存nil
和false
值-如果这些值的计算成本很高,这很有用。我认为您的答案是错误的:Rails.cache.exist?('foo')#=>true
是缓存nil值,我的意思是,下一个值仍将被写入。它可能是一个指定缓存存储的选项,而不是来自ActiveSupport的基本缓存存储。