2012-02-13 3 views
0

У меня есть категория и подкатегория. Категория имеет много подкатегорий и подкатегория относится к категории. Каждая подкатегория в настоящее время имеет поле позиции, чтобы отслеживать, где она находится под категорией, к которой она принадлежит.Лучший способ обработки отношений Категория/Подкатегория Ruby on Rails

Проблема с тем, как я это делаю, заключается в том, что каждому мне нужно поле :position, чтобы быть уникальным для каждой категории. Поэтому вместо того, чтобы использовать validates_uniqueness_of :position в моей модели подкатегории, мне нужен способ проверить, что поле позиции уникально для конкретной категории. У кого-нибудь есть какие-либо идеи или, возможно, раньше были затронуты этой проблемой?

ответ

1

Расширяя lucapettes ответ,

Вложенный набор (https://github.com/skyeagle/nested_set) что-то вроде этого:

- category 
+- category 
+- category 
+--- category 
+- category 
- category 
+- category 
+- category 
+--- category 
+- category 

Вы можете добавить узел в любом месте и установить вы бы связали свой продукт с любой категорией.

Посмотрите в этот файл для методов https://github.com/skyeagle/nested_set/blob/master/lib/nested_set/base.rb

вики для awsome_nested_set может иметь некоторые лучшие документы, https://github.com/collectiveidea/awesome_nested_set/wiki/Awesome-nested-set-cheat-sheet

Например, вы можете переместить элемент влево, (например, в списке, как это) category.move_left

чтобы понять эту модель и почему это работает, читайте Trees in SQL by Joe Celko

+0

Спасибо, я помню, как немного перебирал деревья в школе. Должно было больше обратить внимание. Можете ли вы посоветовать мне, когда вы решите использовать NestedList вместо простых отношений role_to и has_many? – ruevaughn

+0

Скорость - основное преимущество с глубокими деревьями – macarthy

+0

Я работаю над ее внедрением, могу ли я поместить 'act_as_nested_set' в мою модель модели, модель подкатегории и модель продукта? и мне нужно добавить lft, rgt и parent_id ко всем из них? – ruevaughn

1

Использовать NestedSet для обработки категорий и подкатегорий и ActsAsList для обработки положения.

+0

я также буду иметь продукты, которые принадлежат к подкатегории, будет ли NestedSet работать с этими отношениями? – ruevaughn

+0

Фактически листы во вложенном наборе уже упорядочены, поэтому вы можете просто использовать вложенный набор. Да, вы можете иметь продукты в подкатегориях в этой модели. – macarthy

+0

Добавлен ответ с более подробной информацией и объяснением вложенных наборов – macarthy

1

Я считаю, что это подтверждает уникальность имени на основе идентификатора пользователя (т.е. имя является уникальным для каждого пользователя):

class Report < ActiveRecord::Base 
    validates_uniqueness_of :name, :scope => [:user_id] 
end 

Простое объединение в has_many и belongs_to может работать для вас. Если позиция является целым числом, вы можете сделать order_by :position в своем контроллере с уникальностью этой позиции или без нее.

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