我有一个Active Record模型方法,它基本上只是一个数据库查询,我想缓存结果,理想情况下就像通过模型中的局部变量一样:
my_data = method_already_called ? stored_results : do_query
这让我意识到我并不真正理解Active Record模型的对象生命周期,所有Rails指南都告诉你关于回调的内容。具体来说,我猜可以在用户想要检索与该对象关联的一些数据时创建该对象,但我不知道该对象何时会被销毁。
在实际层面上,假设用户请求一些信息,这会导致创建AR对象,从DB获取一些实例数据并在将其呈现给用户之前对其进行操作。如果用户想要根据该信息指示它做某事,那么该对象在内存中会挂起多长时间?
提前致谢。
编辑:我特别感兴趣的是Ruby 2.4上Rails 5.1的行为。答案 0 :(得分:1)
在实践中,只要您保留对此实例的引用即可。在大多数情况下 - 直到请求完成。
class Model
# most common memoization pattern
def something
@cached_result ||= do_query
end
end
因此,当您的模型将被实例化(在控制器/服务/等中)时,只要您可以引用它,它就会可用。在下一个请求中,将重新计算@cached_result
。
如果要在请求之间缓存某些内容,可以使用CacheStore:
class Model
def something
Rails.cache.fetch("cache_key") do
do_query
end
end
end
不要将缓存视为永久存储。但这将允许您在请求之间缓存一段时间。
btw,将为每个模型实例计算@cached_result。如果您执行Model.where(field: "value")
之类的返回2个以上实例的内容,则每个实例都会在第一次调用时执行do_query
。