В настоящее время у меня есть приложение для рельсов, которое содержит тысячи записей, связанных с отношениями родитель-потомок.ruby Оптимизация рекурсии родительского ребенка
Я бы хотел, чтобы методы, которые эффективно возвращают всех потомков или предков для каждой записи. У меня есть рабочий метод, который делает это рекурсивно, но в настоящее время он заполняет большое количество массивов (до 100 тыс. Записей), а затем выравнивает их и удаляет дубликаты. Есть ли более эффективный способ добиться этого, чем мой текущий код, который занимает несколько часов для всех записей? Я не думаю, что драгоценные камни, такие как Ancestry, подходят, потому что у меня нет строгой древовидной структуры.
Большое спасибо за внимание.
class Record < ActiveRecord::Base
has_many :children, through: :reverse_relationships, source: :child
has_many :parents, through: :relationships, source: :parent
def all_children
children.map do |child|
[child] + child.all_children
end.flatten.uniq
end
def all_parents
parents.map do |parent|
[parent] + parent.all_parents
end.flatten.uniq
end
end
'through:' не выглядит мне как классическая иерархия parent-child, есть ли причина для этого (делает рекурсию медленнее)? –
Я думал, что это был подходящий способ моделирования самореференциальных отношений. Мои записи - это действия в рамках графика, в котором каждая ссылка на другие действия. Не могли бы вы сообщить мне, есть ли лучший способ? – Jimbo
Ребята, похоже, что вложенные наборы arent, что мне нужно, потому что у меня на объектах может быть несколько родителей. Поэтому, если кто-то может предоставить простой способ улучшить производительность кода, который у меня есть, это было бы очень признательно. – Jimbo