Кэширование динамического списка категорий Acts_as_tree

У меня есть модель категории, которая использует act_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>

person David    schedule 02.10.2011    source источник


Ответы (1)


Драгоценный камень acts_as_tree довольно устарел. Последняя версия (0.1.1) выпущена в феврале 2010 года, и ее функциональность довольно ограничена.

Я рекомендую вам взглянуть на ancestry, драгоценный камень, который предоставляет аналогичную функциональность, но добавляет гораздо больше. В частности, взгляните на раздел Выбор узлов по глубине.

person rdvdijk    schedule 02.10.2011
comment
Это здорово, и лучший драгоценный камень. Я могу выбрать все соответствующие узлы, но как только я возьму один из них и сделаю ‹node›.children, он сделает еще один вызов базы данных. Любые решения для этого? - person David; 02.10.2011
comment
Я попробую это сам и посмотрю, сможет ли он выполнять нетерпеливую загрузку узлов дерева. - person rdvdijk; 02.10.2011
comment
Вы пробовали использовать subtree? Это делает один запрос для всего поддерева в текущем узле. Это работает даже без кэширования глубины. - person rdvdijk; 02.10.2011
comment
А еще лучше используйте: node.subtree.arrange. Вызов subtree извлекает все узлы, а вызов arrange помещает их во вложенный хеш в виде дерева. - person rdvdijk; 02.10.2011
comment
Сейчас ты разговариваешь! Спасибо :) - person David; 02.10.2011