Категория ребенок другой категории в рельсах - PullRequest
2 голосов
/ 24 октября 2010

Как внедрить в рельсы категорию, которая может быть дочерней для другой категории (самореференциальный has_one)?

Спасибо

Ответы [ 2 ]

3 голосов
/ 24 октября 2010

Во-первых, я считаю, что вы хотите отношения 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 голосов
/ 24 октября 2010

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

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

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

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

acts_as_list :scope => 'ancestry #{(ancestry.blank? ? "IS NULL" : "=\'" + ancestry + "\'")}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...