缓存动态Acts_as_tree类别列表

时间:2011-10-02 09:06:16

标签: ruby-on-rails caching acts-as-tree

我有一个使用acts_as_tree

的分类模型
class Category < ActiveRecord::Base
  acts_as_tree :order=>"name"
end

当我显示我的类别树时,我使用递归,每次生成几乎相同的部分(除了检查或不检查某些复选框),需要大量的数据库调用。

我想缓存这个问题,但是我能想到的唯一一件事就是将Category.all转储到新的非ActiveRecord数据结构中以减少调用次数。还有更好的方法吗?

index.html.erb

<%= render :partial=> "/categories/category_checkboxes", :locals=>{:select_categories=>@categories_ids} %>

_category_checkboxes.html.erb

<% @categories.each do |category| %>
    <h3><a href="#"><%=category.name%></a></h3>
    <div>
      <% category_children = category.children %>

      <%= render :partial => "/categories/category_checkbox_children",
                 :locals => { :child_categories => category_children, 
                              :chk_class=>chk_class, 
                              :select_categories=>select_categories } unless category_children.empty? %>
    </div>
<% end %>

_category_checkboxes_children.html.erb

<ul>
<% child_categories.each do |category| %>
  <li class= "category_check_box">
  <%=check_box_tag("category#{category.id}", 1, select_categories.index(category.id)%>
  <%=label_tag("category#{category.id}" ,"#{category.name}")%>
  <%= render :partial => "/categories/category_checkbox_children",  :locals => { 
                          :child_categories => category.children,
                          :select_categories=>select_categories} unless category_children.empty? %>
<% end %>
</li>
</ul>

1 个答案:

答案 0 :(得分:1)

acts_as_tree宝石已经过时了。最后一个版本(0.1.1)是从2010年2月开始的,其功能非常有限。

我建议你看看ancestry,这是一个提供类似功能的gem,并且已经添加了更多。具体来说,请查看按深度选择节点的部分。