列出父母然后是孩子

时间:2012-01-20 19:18:28

标签: ruby-on-rails

我有一个类别为id, name, parent_id的数据库结构。

用户可以输入类别,如果没有父类,则parent_id字段将设置为0.

我的观点是这里显示的一个基本循环:

  <% @categories.each do |category| %>
    <tr class="<%= cycle('one', 'two') %>">
      <td>

        <%= indent(depth(category.id)) %> 
        <%= best_in_place category, :name %>

        <%= link_to(image_tag('/images/delete.png', :class => 'delete'), "categories/delete/#{category.id}")%>
      </td>
    </tr>
  <% end %>

indent(depth(category.id))函数只是获取子类别深度的一种方法,并为了视觉目的添加了许多类别。 http://d.pr/Ss8e

我的问题是孩子们并没有被列在他们各自的父母身边。我不知道怎么回事,有什么建议吗? (group_by或其他循环可能?)

修改 对不起,不清楚。我拥有的数据库结构是这样的:

CATEGORIES
   id, name, parent_id, user_id
ITEMS
   id, name, category_id

我希望显示如下类别:

Parent1
  Child1
  Child2
Parent2
  Child1

目前,循环会根据项目的创建时间列出项目,而不会按照我喜欢的内容对其进行分组。

2 个答案:

答案 0 :(得分:1)

看来你应该:

category.rb

class Category < ActiveRecord::Base
  scope :parents, lambda {where("parent_ID IS NOT NULL")}
  scope: for_parent, lambda{|parent| where(:parent_id => parent.id)}

  def children
    Category.for_parent(self)
  end
end

然后在你的控制器中:

@categories = Category.parents.all

在你看来

<% @categories.each do |category| %>
  <tr>
    <td><%= category.name %></td>
  </tr>
  <% category.children.each do |child| %>
    <tr>
      <td><%= child.name %></td>
    </tr>
  <% end %>
<% end %>

答案 1 :(得分:0)

使用parent_id,类别BELONGS_TO父级和父级has_many:categories

<% @parents.each do |parent| %>
  <h1><%= parent.name %></h1>
  <% parent.categories.each do |category| %>
    <!-- Your stuff here -->
  <% end %>
<% end %>