Как реализовать в рельсах категорию, которая может быть дочерней из другой категории (self-referential has_one)?Категория ребенка другой категории в рельсах
Благодаря
Как реализовать в рельсах категорию, которая может быть дочерней из другой категории (self-referential has_one)?Категория ребенка другой категории в рельсах
Благодаря
Во-первых, я полагаю, вы хотите отношения 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
Хороший удачи в вашем приложении!
Простым подходом является использование внешнего ключа category_id
, как уже указывали другие. Однако, если вы говорите о вложенности множества категорий, это может быть довольно неэффективным. (Примечание: добавление большего количества ваших требований было бы полезно.)
Мне действительно очень нравится ancestry gem. Вот соответствующий отрывок из документов (акцент мой).
Как можно видеть в предыдущем разделе , Восходящее хранит путь от корня к родительскому для каждого узла. Это вариация на материальный шаблон базы данных пути . Это позволяет Восходящее принести какое-либо отношение (братьев и сестер, потомков и т.д.) в одного запроса SQL в без сложных алгоритмов и непонятности, связанных с левыми и правыми значениями. Кроме того, любые вставки, удаляются и обновляются только влияют на узлы в пределах затронутого собственного поддерева узла.
И вот бонус халява, только потому, что это не сразу очевидно. Если вам нужно рассматривать братьев и сестер как список с позициями, вы можете охватить их следующим образом.
acts_as_list :scope => 'ancestry #{(ancestry.blank? ? "IS NULL" : "=\'" + ancestry + "\'")}'
Спасибо, jdl, я посмотрю на это, но на самом деле у меня довольно простое требование сделать категорию и подкатегорию простой системы продуктов. Я буду помнить этот драгоценный камень, когда мне нужны более сложные структуры, как вы сказали :) спасибо, что указали на меня! –
Спасибо, это сработало довольно хорошо. Я был немного смущен этой ассоциацией, и ваш ответ прояснил все это :) Спасибо. –