【发布时间】:2013-10-25 17:33:58
【问题描述】:
我正在尝试将 Rails 请求缓存到需要 proc 的外部服务。
为了让我能够区分 2 个请求,proc 是 Rails 缓存键的一部分很重要。
但是,具有相同 proc 和 proc 代码中的值的多个请求,每次仍将评估为不同的 proc 对象。
例如:
#<Proc:0x007ff6f675dd08@/Users/app/development/work/runner.rb:10>
#<Proc:0x007ff6ffb50790@/Users/app/development/work/runner.rb:10>
因此,即使对于相同的请求,我也会遇到缓存未命中。
如果 proc 在代码和变量值方面相同,我如何使用缓存键中的 block/proc 计算结果相同。
服务调用类似于
def some_method
call_service do
a= 3;
b=6
end
end
def call_service(block)
Rails.cache.fetch(Date.today, block) {
external_service(&block)
}
end
I want to be able to compare blocks :
eg
{a=3, a*a} == {a=3, a*a} => True
{a=3, a*a} == {a=4, a*a} => false
{a=3, a*a} == {a=4, a*a*a} => False
我试过用,
block.source
RubyVM::InstructionSequence.of(block).disasm
但它们都没有捕获块的状态,即变量的值(a=3 等)
在 Rails 中实现这种缓存的最佳方法是什么?
附注:
使用 Rails4 和 reddis 作为缓存
【问题讨论】:
标签: ruby-on-rails ruby caching block proc