Rails使用引用自身的表创建分组的无序列表吗?

时间:2018-11-02 18:36:04

标签: ruby-on-rails

我有一个类别表,如下所示:

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>

到目前为止,我已经建立了parent方法来基于nil捕获父母:

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:错误:列“ 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 :(得分:0)

谈论显示类别树。建议不要使用单个普通SELECT查询来获取所有类别,并以编程方式构建嵌套树,例如:

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

因此,根类别(无父类别)将以@categories[nil]的形式提供。您可以在列表的each循环中开始显示类别树。对于每个根类别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的父级,而类别B又是类别A的父级,或者类别A是其自身的父级。您需要确保树上没有这样的循环。