Rails低级查询缓存

时间:2016-04-17 10:50:40

标签: ruby-on-rails caching activerecord

我想缓存一个控制器查询结果,因为它是一个非常静态的数据,不会经常更改。

所以我想知道我是否可以定义这个方法:

  def cached_collections
    Rails.cache.fetch('collections', :expires_in => 24.hours) do
      Collection.all
    end
  end

以某种方式使用

@collections = Collection.all

我可以直接调用该方法吗?

@collections = cached_collections

这是有效的,但这是正确的方法吗?在使用Memcached或Redis之前

1 个答案:

答案 0 :(得分:3)

在方法cached_collections中,您尝试缓存复杂的对象结构(ActiveRecord::Relation的实例)。这可能是可以实现的,但更简单的方法是缓存视图或查看片段:

<% cache do %>
  <% @collection.each do |item| %>
    <%# do something with item %>
  <% end %>
<% end %>

您仍然可以在控制器内部初始化查询,例如:

@collection = Collection.limit(10)

ActiveRecord::Relation的实例是懒惰的;它们以某种方式模仿数组的行为,在您明确访问获取的结果之前它们不会访问数据库,例如:@collection.first@collection.each{ #... }

只要您的片段被缓存,就不会有数据库查询。

请参阅此内容以获取缓存示例:http://guides.rubyonrails.org/caching_with_rails.html

编辑:

对于JSON请求,您可以这样做:

@collection = Collection.all
render :json => Rails.cache.fetch('collections', :expires_in => 24.hours) do
  @collection.to_json
end

同样,除非您的缓存过时且缓存中没有复杂的对象结构,否则不会向数据库发出请求。