Как моделировать семейные отношения в rails 3?

#sql #ruby-on-rails #ruby-on-rails-3 #self-reference

#sql #ruby-on-rails #ruby-on-rails-3 #ссылка на себя

Вопрос:

Я работаю над базой данных контактов в rails 3..

Одна вещь, которая действительно расстраивает, это то, насколько уродлив код семейных отношений..

Есть ли чистый способ сделать это в rails?

В основном все контакты относятся к классу contact (поди разберись!)

И контакты имеют много family_relationships (другая модель) и много родственников через family_relationships.. Модель семейных отношений также имеет один тип семейных отношений (другая модель)

До сих пор я реализовывал это, используя приведенные здесь методыhttp://railscasts.com/episodes/163-self-referential-association (используя обратные отношения и т.д.)

Но это просто не кажется очень чистым .. и если я хочу получить все контакты, родственников, отношения и т.д., Я должен перейти к необработанному SQL или присоединиться к массивам..

Есть ли лучший (или окончательный) способ, которым это делается в rails?

Ответ №1:

Драгоценный камень Ancestry, похоже, решает именно такую проблему:

Ancestry — это драгоценный камень / плагин, который позволяет организовать записи модели Ruby on Rails ActiveRecord в виде древовидной структуры (или иерархии). Он использует один столбец базы данных, интуитивно отформатированный, с использованием варианта шаблона материализованного пути. Он предоставляет все стандартные отношения древовидной структуры (предки, родительский элемент, корень, дочерние элементы, братья и сестры, потомки), и все они могут быть извлечены в одном sql-запросе. Дополнительными функциями являются поддержка STI, области видимости, кэширование глубины, ограничения глубины, простая миграция из старых плагинов / драгоценных камней, проверка целостности, восстановление целостности, расположение (под) дерева в хэши и различные стратегии для работы с потерянными записями.

Комментарии:

1. Родословная выглядит как конкретное решение этой проблемы.

2. Возможно. «Ancestry — это драгоценный камень / плагин, который позволяет организовать записи модели Ruby on Rails ActiveRecord в виде древовидной структуры (или иерархии)». Но не все семейные деревья являются деревьями в смысле информатики. Некоторые из них больше похожи на сети; у них есть циклы. Я не знаю, поддерживает ли Ancestry циклы в дереве.

3. Вот ссылка на Railscast в Ancestry. railscasts.com/episodes/262-trees-with-ancestry Я «думаю», что он поддерживает циклы, но я не уверен.

4. Правильно ли я понимаю, что этот (Ancestry) gem больше не будет работать с Rails 2.3.x? Я использую Rails 2.3.14. Извините, мне не повезло?

5. Насколько я понимаю, Родословная предполагает наличие одного родительского узла, поэтому, например, не поддерживала бы 2 родительских узла.