正确的rails缓存复杂查询方式

时间:2015-11-09 04:33:32

标签: ruby-on-rails caching

我不熟悉缓存,我不确定我最好的做法是什么。

我想缓存依赖于复杂查询的视图的一部分。查询类似于:

@sessions_next_week = group_by_wday(LittleClassSession.location_only([1,2]).age_range_only(age_from, age_to).supports_dropins_only(support).approved_users_only.next_week)

上面你会看到许多范围和方法被调用。该视图呈现名为@sessions_next_week的实例变量,如下所示:

<% @sessions_next_week.each do |wday, lcs| %>
  <h3><%= wday %></h3>
  <%= render partial: 'table_head' %>
  <% lcs.each do |s| %>
    <%= render partial: 'table_row', :locals => {:s => s, :show_day => true} %>
  <% end %>
  <%= render partial: 'table_foot' %>
<% end %>

正如您所看到的,@sessions_next_week被迭代,其子代被迭代。鉴于此,并且考虑到实例变量中查询结果的性质,我不确定在何处实现缓存。在模型中?在视图中?

所以我的问题是:

  1. 我是否需要模型缓存,或者我可以在视图中执行此操作吗?
  2. 什么是正确的实施?

1 个答案:

答案 0 :(得分:0)

解决方案是简单地添加两个字符:

@sessions_next_week ||= group_by_wday(LittleClassSession.location_only([1,2]).age_range_only(age_from, age_to).supports_dropins_only(support).approved_users_only.next_week)

这称为memoization,您可以查找它。这是一个来源:http://www.justinweiss.com/articles/4-simple-memoization-patterns-in-ruby-and-one-gem/