我想缓存一个控制器查询结果,因为它是一个非常静态的数据,不会经常更改。
所以我想知道我是否可以定义这个方法:
def cached_collections
Rails.cache.fetch('collections', :expires_in => 24.hours) do
Collection.all
end
end
以某种方式使用
@collections = Collection.all
我可以直接调用该方法吗?
@collections = cached_collections
这是有效的,但这是正确的方法吗?在使用Memcached或Redis之前
答案 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
同样,除非您的缓存过时且缓存中没有复杂的对象结构,否则不会向数据库发出请求。