Rails Active Record模型生命周期

时间:2017-09-14 15:49:44

标签: ruby-on-rails

我有一个Active Record模型方法,它基本上只是一个数据库查询,我想缓存结果,理想情况下就像通过模型中的局部变量一样:

my_data = method_already_called ? stored_results : do_query

这让我意识到我并不真正理解Active Record模型的对象生命周期,所有Rails指南都告诉你关于回调的内容。具体来说,我猜可以在用户想要检索与该对象关联的一些数据时创建该对象,但我不知道该对象何时会被销毁。

在实际层面上,假设用户请求一些信息,这会导致创建AR对象,从DB获取一些实例数据并在将其呈现给用户之前对其进行操作。如果用户想要根据该信息指示它做某事,那么该对象在内存中会挂起多长时间?

提前致谢。

编辑:我特别感兴趣的是Ruby 2.4上Rails 5.1的行为。

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