Иерархическое моделирование рельсов. Несколько категорий - PullRequest
2 голосов
/ 15 января 2012

Я имею в виду следующее:

  1. A продукт может иметь несколько категорий
  2. A категория может быть в разных продуктах.
  3. A категория имеет родителя (категорию), если это не общая категория (в этом случае родитель будет нулем)

Думая с точки зрения реляционной базы данных, я хотел бы реализовать это как

  1. Таблица Товар
  2. Таблица product_category (в качестве первичных ключей: product_id, category_id)
  3. Таблица категория (с parent_id, ссылающимся на категорию, или ноль, если это "общая" категория)

Думая с точки зрения моделирования Rails, у меня есть следующее (я избегаю писать поля, которые не имеют значения для этой проблемы отношений / иерархии, с которой я имею дело):

class Product < ActiveRecord::Base
...
has_many :categories


class Category < ActiveRecord::Base
...
Here comes de doubt: How do I specify the parent_id? 

Есть ли способ указать, что у категории есть один и только один родительский идентификатор, который ссылается на другую категорию?

1 Ответ

6 голосов
/ 15 января 2012

Что-то вроде этого довольно типично:

class Product < ActiveRecord::Base
  has_many :categories, :through => :products_categories

  # A has_and_belongs_to_many association would also be fine here if you
  # don't need to assign attributes to or perform any operations on the
  # relationship record itself.
end

class Category < ActiveRecord::Base
  has_many   :products, :through => :products_categories

  belongs_to :category
  has_many   :categories # Optional; useful if this is a parent and you want
end                      # to be able to list its children.

В качестве альтернативы вы могли бы дать этим двум последним именам, например:

belongs_to :parent,   :class_name => :category
has_many   :children, :class_name => :category
...