2010-10-24 3 views

ответ

3

Во-первых, я полагаю, вы хотите отношения has_many, а не HAS_ONE. Я не могу представить ситуацию, в которой вы хотели бы иметь категории по самых одной категории детей. Предыдущий ответ также дает вам только одно направление - категории знают об их родителях, но не о своих детях.

Полное решение достаточно просто. Категории таблица должна иметь столбец category_id и модель должна выглядеть следующим образом:

class Category < ActiveRecord::Base 
    belongs_to :category 
    has_many :categories 
end 

Если вы хотите идти дальше, шаг и назвать их родителями и детьми, вы можете:

class Category < ActiveRecord::Base 
    belongs_to :parent, :class_name => 'Category', :foreign_key => 'category_id' 
    has_many :children, :class_name => 'Category', :foreign_key => 'category_id' 
end 

Хороший удачи в вашем приложении!

+0

Спасибо, это сработало довольно хорошо. Я был немного смущен этой ассоциацией, и ваш ответ прояснил все это :) Спасибо. –

0

Простым подходом является использование внешнего ключа category_id, как уже указывали другие. Однако, если вы говорите о вложенности множества категорий, это может быть довольно неэффективным. (Примечание: добавление большего количества ваших требований было бы полезно.)

Мне действительно очень нравится ancestry gem. Вот соответствующий отрывок из документов (акцент мой).

Как можно видеть в предыдущем разделе , Восходящее хранит путь от корня к родительскому для каждого узла. Это вариация на материальный шаблон базы данных пути . Это позволяет Восходящее принести какое-либо отношение (братьев и сестер, потомков и т.д.) в одного запроса SQL в без сложных алгоритмов и непонятности, связанных с левыми и правыми значениями. Кроме того, любые вставки, удаляются и обновляются только влияют на узлы в пределах затронутого собственного поддерева узла.

И вот бонус халява, только потому, что это не сразу очевидно. Если вам нужно рассматривать братьев и сестер как список с позициями, вы можете охватить их следующим образом.

acts_as_list :scope => 'ancestry #{(ancestry.blank? ? "IS NULL" : "=\'" + ancestry + "\'")}' 
+0

Спасибо, jdl, я посмотрю на это, но на самом деле у меня довольно простое требование сделать категорию и подкатегорию простой системы продуктов. Я буду помнить этот драгоценный камень, когда мне нужны более сложные структуры, как вы сказали :) спасибо, что указали на меня! –

Смежные вопросы