如何分组'每个人都做'父母的输出?

时间:2017-03-13 01:26:10

标签: ruby-on-rails ruby

我目前正在使用acts_as_tree gem并希望显示我的所有类别名称,以父类别名称分隔。这是我尝试过的。

<% @categories.each do |category| %>
<h4><%= category.parent.name if category.parent %></h4>
<%= category.name%>
<% end %>

它不起作用,因为每个孩子都在重复父母的头衔。我希望实现的是父母只展示一次,然后是其子女。

家长1

  • 父母1儿童1
  • 父母1儿童2
  • 父母1孩子3

家长2

  • 父2孩子1
  • 父2孩子2
  • 父2孩子3

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:1)

您可以先使用categories共同对parent进行分组,使用group_by method作为枚举; e.g。

@categories.group_by(&:parent)

它将产生类似以下内容的哈希:

# { 
#   parent1 => [category1, category2],
#   parent2 => [category3]
# }

# or

{#<Parent:0x007fa92582f930 @name="Parent1">=>
  [#<Category:0x007fa92582f868
    @name="Category1",
    @parent=#<Parent:0x007fa92582f930 @name="Parent1">>,
   #<Category:0x007fa92582f7c8
    @name="Category2",
    @parent=#<Parent:0x007fa92582f930 @name="Parent1">>],
 #<Parent:0x007fa92582f8b8 @name="Parent1">=>
  [#<Category:0x007fa92582f750
    @name="Category3",
    @parent=#<Parent:0x007fa92582f8b8 @name="Parent1">>]}

然后你迭代每个Parent及其分组的类别,在你的视图模板中渲染,如下所示:

<% @categories.group_by(&:parent).each do |parent, categories| %>
  <h4><%= parent.name if parent %></h4>
  <% categories.each do |category| %>
    <%= category.name %>
  <% end %>
<% end %>

答案 1 :(得分:1)

我认为你可以完成类似的事情:

<% parents.each do |parent| %>
  <h4><%= parent.name %></h4>
  <% parent.children.each do |child| %>
    <%= child.name %>
  <% end %>
<% end %>

所以对你的例子来说:

<% @categories.parents.each do |parent| %>
  <h4><%= parent.name %></h4>
  <% parent.children.each do |category| %>
    <%= category.name %>
  <% end %>
<% end %>

根据您的类别模型的父级名称,您还可以执行以下操作:

Parent.tree_view(:name)

答案 2 :(得分:0)

究竟是什么category.parent?如果它不是nil或显式为false,则<h4><%= category.parent.name if category.parent %></h4>将始终显示category.parent.name,因为if语句必须检查category.parent是否存在。假设每个孩子都有父母,那么每次都会显示父母。你必须改变if语句。

抱歉,我无法提供更多帮助,如果您修改帖子以包含categoryparent中的代码,也许我可以提出建议。

答案 3 :(得分:0)

这就是我的意思。

let x = 2;

但是,此工作仅适用于1级别类别。 如果您需要深层次类别,则可能需要为此定义递归方法。