我有一个类别表,如下所示:
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>
这导致形式参数不能为常数。
那么如何使用引用自身的表创建分组的无序列表?
答案 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是其自身的父级。您需要确保树上没有这样的循环。