Ruby on rails 当值为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

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.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的基本缓存存储。