Как построить иерархию тегов на рельсах с помощью действий-как-тегируемых-на

У меня есть приложение rails, которое включает в себя теги для сообщений в блогах с использованием драгоценного камня, который действует как пометка. Моя идея состоит в том, чтобы расширить механизм тегов этого драгоценного камня, используя подход с умеренными ссылками, где я могу создать нескольких пользователей в качестве владельцев тегов, и они могут связать один тег с другим как родительский/дочерний.

В настоящее время в системе есть независимые теги, такие как Education, Child Education и Distance Education.

Владелец тега Education может выбрать Child Education и Distance Education в качестве дочерних элементов первого уровня и связать их вместе. Эта связь не будет видна до тех пор, пока она не будет одобрена таксономистом (администратором тегов).

Точно так же конечный пользователь также может предложить тег Distance Education в качестве дочернего для Education, и этот запрос станет видимым для администратора тега. На основании его одобрения отношения будут установлены.

Вот несколько вопросов, которые у меня есть относительно вышеуказанного требования:

  1. Рекомендуется ли расширить гем или мне следует использовать независимую модель тегов, написанную с нуля для поддержки этой иерархической системы?

  2. Если я продолжу со схемой, предоставленной драгоценным камнем, какую модель следует использовать для разработки такого требования. В частности, должен ли я использовать одну таблицу со столбцом parent_id с идентификатором тега и именем тега? Или я должен поддерживать их отношения в отдельной таблице с ассоциациями «многие ко многим» (tag_id, parent_tag_id (как внешний ключ)).

  3. Я также новичок в структурах данных, поэтому мне потребуются некоторые начальные данные по выбору алгоритмов для эффективного перемещения между семействами тегов. Использование связанного списка было одним из моих вариантов, однако, учитывая мантру Rails о соглашении над конфигурацией, я действительно не уверен, как это сделать.


person Donny    schedule 28.03.2013    source источник


Ответы (1)


Я помню, как 4 года назад делал нечто подобное с ActsAsTree.

Также есть пример того, как сделать это вручную здесь.

Для обоих вариантов потребуется столбец parent_id в таблице тегов, и они действительно просты. Просто создайте tag.rb в папке ваших моделей и расширьте класс Tag.

Пс. Прошло много времени, но я помню, что мне приходилось проверять, нет ли петель, просто имейте это в виду.

person trompa    schedule 05.04.2013
comment
Спасибо, Тромпа. Я думаю, что этот ответ решает большинство моих проблем. - person Donny; 06.04.2013
comment
@Trompa - Нет циклов? Что именно это значит? - person lcm; 02.10.2016
comment
Циклы на дереве вы создаете через parent_id. Потенциально вы можете сделать что-то вроде A -> B, B -> C, C -> A. ( C.parent_id = B, B. Parent_id = A, A.parent_id = C ) - person trompa; 03.10.2016