#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 родительских узла.