2013-06-28 4 views
1

В настоящее время у меня есть приложение для рельсов, которое содержит тысячи записей, связанных с отношениями родитель-потомок.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 
+0

'through:' не выглядит мне как классическая иерархия parent-child, есть ли причина для этого (делает рекурсию медленнее)? –

+0

Я думал, что это был подходящий способ моделирования самореференциальных отношений. Мои записи - это действия в рамках графика, в котором каждая ссылка на другие действия. Не могли бы вы сообщить мне, есть ли лучший способ? – Jimbo

+0

Ребята, похоже, что вложенные наборы arent, что мне нужно, потому что у меня на объектах может быть несколько родителей. Поэтому, если кто-то может предоставить простой способ улучшить производительность кода, который у меня есть, это было бы очень признательно. – Jimbo

ответ

0

Проверьте несколько иной способ представления иерархии во вложенном наборе. https://github.com/collectiveidea/awesome_nested_set

Это устраняет рекурсивные запросы.

+0

Спасибо, что указали это, я дам ему попробовать – Jimbo

+0

DGM не могли бы вы рассказать мне, работают ли вложенные наборы, когда у одного есть несколько родителей? Это имеет место в моем приложении, что противоречит всем примерам, которые я видел. – Jimbo

+0

О, нет, я пропустил это. Вложенные наборы являются чисто иерархическими. – DGM

0

Использование самой прямой схемы довольно неэффективно по самой своей природе. Возможно, вы захотите рассмотреть возможность внедрения Nested Set Model. Быстрый поиск показывает, что для Rails есть несколько драгоценных камней.