2012-01-20 3 views
1

У меня есть структура базы данных для категорий как 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 или другой цикл, возможно?)

EDIT: Извините, что не ясны. Структура БД у меня есть, как это:

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

Ищу показать категории, как это:

Parent1 
    Child1 
    Child2 
Parent2 
    Child1 

В настоящее время, цикл перечисляет элементы, основанные на когда они были созданы, это не группа их parent_id, как я хотел бы

+0

у вас есть методы на ваша категория 'parent' и' children'? если нет, начните там и создайте их –

+0

. Я не уверен, что вы имеете в виду, методы, которые у меня есть для категорий внутри контроллера, - это '@categories = @ user.categories' – bcackerman

+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 %> 
+0

Спасибо, но я попробовал запустить это и получил 'Незаконная инструкция' в терминале, и он закрыл экземпляр сервера – bcackerman

+0

Я обновляю опечатку в категории # children петля и for_parent lambda. Если это была проблема, ее легко устранить. –

0

с в parent_id, категория BELONGS_TO родителей, и родительское has_many: категории

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

Позволяет ли я создавать неограниченные категории детей? – bcackerman

+0

Я не верю, что понимаю ... У вас есть отношения has_many и belongs_to, созданные в ваших моделях? –

+0

http://guides.rubyonrails.org/association_basics.html#the-types-of-associations –