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

#ruby-on-rails #caching #acts-as-tree

#ruby-on-rails #кэширование #действует как дерево

Вопрос:

У меня есть модель категории, которая использует acts_as_tree

 class Category < ActiveRecord::Base
  acts_as_tree :order=>"name"
end
  

Когда я отображаю свое дерево категорий, я использую рекурсию, и каждый раз генерируется почти идентичный фрагмент (за исключением того, что некоторые флажки установлены или нет), что требует большого количества вызовов базы данных.

Я хотел бы кэшировать это, но на данный момент единственное, о чем я могу думать, — это сбросить Category.all в новую структуру данных неактивной записи, чтобы уменьшить количество вызовов. Есть ли лучший способ?

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:

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

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

Комментарии:

1. Это здорово, и это лучший камень. Я могу выбрать все соответствующие узлы, но как только я беру один из них и выполняю <node>.children, он выполняет другой вызов базы данных. Какие-либо решения для этого?

2. Я попробую это сам и посмотрю, сможет ли он выполнять быструю загрузку на узлах дерева.

3. Вы пробовали использовать subtree ? Это выполняет один запрос для всего поддерева под текущим узлом. Это работает даже без кэширования глубины.

4. И еще лучше, используйте: node.subtree.arrange . subtree Вызов извлекает все узлы и arrange помещает их во вложенный хэш в виде дерева.

5. Теперь ты говоришь! Спасибо 🙂