Вы смотрите на довольно сложный алгоритм .Выполните поиск для в ширину и в глубину и найдите идеи о том, как реализовать рекурсивный метод в вашей модели Person для этого.
Одно общее предложение: настройте личные связи в вашей модели Person, например:
has_many :from_relations, :source => :from_person, :through => :from_relationships
has_many :to_relations, :source => :to_person, :through => :to_relationships
Затем вы можете получить набор отношений с @ person.from_relations и @ person.to_relations.
В зависимости от потребностей вашего приложения, вы можете еще больше упростить вещи, имея дело с направлением в вашей модели отношений, например:
Модель человека:
has_many :relationships
has_many :relations, :through => :relationships
Модель отношений
belongs_to :person
belongs_to :relation, :class_name => "Person"
При более простых ассоциациях метод экземпляра в вашей модели Person, позволяющий определить, связаны ли два человека, будет выглядеть примерно так:
def related_to?(target)
if self == target
return true
elsif self.relations.empty?
return false
else
return self.relations.each {|relation| relation.related_to?(target)}
end
end
Обратите внимание, что используется рекурсия.Кроме того, я не работал над алгоритмом, чтобы убедиться, что нет потенциала для бесконечных циклов из-за циклических ассоциаций (Джо -> Боб -> Джо -> Боб).