Как получить всех потомков объекта в Ruby on Rails

У меня есть модели, связанные следующим образом:

GrandParent 
  has_many :kids
  has_many :grand_children, through: :kids
Kid 
  belongs_to :grand_parent
  has_many :grand_kids
GrandKid
  belongs_to :kid

Я просто хотел бы вызвать .descendants для объекта и получить все объекты, принадлежащие его «происхождению».

Я думал, что использование драгоценного камня предков даст мне метод .descendants, который я хотел, но он создает только дополнительный индекс для одного класса, позволяя вам получать потомков в указанном классе (отлично подходит для таких вещей, как комментарии и ответы, но бесполезен для моей проблемы) Мой код не особо нужен для понимания проблемы, но вот он для интересующихся: https://gist.github.com/bjlinville1/8425bfe88bc7060209e8


person Benjamin Linville    schedule 26.08.2015    source источник
comment
Я бы только предложил сократить ваш пост до наименьшего количества кода, необходимого для понимания проблемы. Это хороший вопрос, но из-за излишней детализации Q теряет смысл. Вы можете включить свой код MVC в GistHub.   -  person onebree    schedule 26.08.2015
comment
Спасибо, Хантер, я отредактировал вопрос для ясности, понял суть и включил упрощенный MVC.   -  person Benjamin Linville    schedule 27.08.2015
comment
Бен, если вы используете родословную, вам нужно будет создать только одну модель Person, и отношение в дереве будет определять, является ли экземпляр прародителем, ребенком, внуком и т. д.   -  person TwiceB    schedule 27.08.2015


Ответы (1)


Я считаю, что вы неправильно интерпретируете драгоценный камень предков. Похоже, вы ожидаете, что Region будет отображаться как дочерний элемент Country. Это правильно?

Родословная полезна для древовидных структур (например, папки -> подпапки -> дочерние подпапки -> и т. д.)

Применение has_ancestry в вашей модели Country позволит вам создавать страны внутри стран. Но я не верю, что это то, что вы ищете.

В любом случае, вы можете настроить эти отношения, установив атрибут «parent_id» для страны при ее создании/обновлении в контроллере. Просто установите его на идентификатор родительской страны. То же самое для регионов, если вам нужна древовидная структура регионов.

person TwiceB    schedule 26.08.2015
comment
Спасибо, это именно то, что я думал, что родословная сделает для меня. Я не уверен, что следил за тем, могу ли я использовать parent_ids для выполнения своих таблиц «предок-потомок», но у меня это работает прямо сейчас, просто вручную кодируя каждое представление. Если вы - или кто-либо еще - знаете хороший СУХОЙ способ написать эту таблицу, чтобы я мог использовать ее на нескольких страницах показа «потомков», я был бы очень признателен. - person Benjamin Linville; 27.08.2015
comment
У вас есть контроллер региона с реализованным действием show? - person TwiceB; 27.08.2015
comment
Я обновил исходный вопрос, включив в него контроллер регионов и регион show.html.haml. - person Benjamin Linville; 27.08.2015
comment
Это выходит за рамки исходного вопроса, поэтому вам, вероятно, следует отправить новый вопрос для лучшего ответа. На данный момент возможно, что то, что вы ищете, может быть решено с помощью частичных представлений: guides .rubyonrails.org/ - person TwiceB; 27.08.2015