Rails создают сгруппированный неупорядоченный список, используя таблицу, которая ссылается на себя? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть таблица категорий, которая выглядит следующим образом:

id store_id parent_category_id name
1  1        nil                Footwear
5  1        1                  Men's Shoes
7  2        nil                Accessories
22 2        7                  Watch

То, что я пытаюсь сделать, - это создать фильтр на моей индексной странице на основе ассоциации с категорией, если они совпадают. Я борюсь за то, чтобы заставить группу / сортировку работать на дизайн. Я пытаюсь отобразить что-то вроде следующего:

p {
display: inline-block;
padding-left: 10px;
}
<ul class="nav">
    <li class="nav-item active">
      <a href="#homeSubmenu1" data-toggle="collapse" aria-expanded="false" class="dropdown-toggle">Footwear</a>
      <p>2,000</p>
      <ul class="collapse list-style-upper" id="homeSubmenu1">
        <li><a href="home-sub-submenu1">Men's Shoes</a>
        <p>1,000</p>
          <ul class="list-style-upper-sub">
            <li>Adidas<p>1,000</p></li>
            <li>Nike<p>500</p></li>
            <li>Convers<p>500</p></li>
          </ul>
        </li>
        <li><a href="#">Women's Shoes</a><p>500</p></li>
        <li><a href="#">Children's Shoes</a><p>500</p></li>
        <li><a href="#">Socks<p>100</p></a>
          <ul class="list-style-upper-sub">
            <li>Blue<p>50</p></li>
            <li>Red<p>25</p></li>
            <li>Green<p>25</p></li>
          </ul>
        </li>
      </ul>

До сих пор я разработал родительский метод для захвата родителей, основанный на нуле:

def parent_category
 Connector::Category.where(parent_category_id: [nil, ''])
end

Это приводит к правильным родителям, но я не могу понять, как сгруппировать по parent_category_id, а затем применить правильные ссылки для применения фильтрации. Я пробовал такие вещи, как:

<ul class="nav">
 <% Connector::Category.group(:name).each do |x|%>
   <li><%=x.name.titleize%></li>
 <%end%>
</ul>

В результате PG :: GroupingError: ERROR: столбец «connector_categories.id» должен появиться в предложении GROUP BY или использоваться в статистической функции.

Итак, я подумал, что просто поместу это в метод индекса для страницы индекса продуктов (где это появляется) со следующим:

def index
 query = query_products
 query = query.search(params[:search]) if params[:search]
 @products = query.order(sortable_query).paginate(page: params[:page], per_page: 20)
 @category = Connector::Category.select(:id, :name).all.order('number ASC').group(:parent_category_id)
end
<ul class="nav">
  <%@category.all.each do |X|%>
   <li><%=x.name%></li>
  <%end%>
</ul>

Это приводит к тому, что формальный аргумент не может быть константой.

Так как мне создать сгруппированный неупорядоченный список, используя таблицу, которая ссылается на себя?

1 Ответ

0 голосов
/ 02 ноября 2018

Говоря о показе дерева категорий. Вместо того, чтобы создавать сложные запросы с группированием к базе данных, я бы порекомендовал извлекать все категории с помощью простого ОДНОГО запроса SELECT и программно создавать вложенное дерево, например:

@categories = Connector::Category.includes(:products).group_by { |category| category.parent_category_id }

Таким образом, корневые категории (без родителя) будут доступны как @categories[nil]. Вы можете начать показ дерева категорий с each -loop над этим списком. Для каждой корневой категории cat список их детей будет доступен как @categories[cat.id].

Поскольку вложение дерева категорий может быть довольно глубоким (могут быть дети, внуки, правнуки и т. Д.), Я бы порекомендовал создать партиал, чтобы показать детей данной категории и назвать его рекурсивно. Пример:

# _category_item.html.erb

<li>
  <a href="#"><%= category.name =><p><%= category.products.count %></p></a>
  <% if @categories[category.id].present? %>
    <ul class="list-style-upper-sub">
      <% @categories[category.id].each do |child| %>
        <%= render 'category_item', category: child %>
      <% end %>
    </ul>
  <% end %>
</li>

и на главном экране:

# index.html.erb

<ul class="list-style-upper">
  <% @categories[nil].each do |root| %>
    <%= render 'category_item', category: root %>
  <% end %>
</ul>

Не по теме: рекурсивная отрисовка дерева категорий может произойти сбой, если у него есть циклы: например, категория A является родителем категории B, которая снова является родителем категории A, или категория A является родителем для себя. Вы должны убедиться, что у дерева нет таких петель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...