Ищете простой тест для циклической ссылки в рекурсивной модели - PullRequest
1 голос
/ 16 октября 2010

У меня есть модель, которая представляет собой сборку, состоящую из компонентов, компоненты могут (сами по себе) также быть сборками. Это выглядит примерно так:

class Component < ActiveRecord::Base
  belongs_to :assembly, :class_name => "Component", :foreign_key => :assembly_id
  has_many :pieces, :class_name => "Component", :foreign_key => :assembly_id
end

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

Моя мысль состоит в том, чтобы обойти дерево, поднимающееся при сохранении компонента, для поиска самого компонента как родителя, деда и т. Д. Я стараюсь избегать циклических ссылок.

Есть ли "простой, Rails-иш" способ сделать это? Любые другие предложения?

1 Ответ

0 голосов
/ 18 октября 2010

Я вообще не знаю рельсы. Тем не менее, похоже, что вы почти ответили на свой вопрос.

Данный вопрос, естественно, поддается рекурсивному решению.

Вы говорите, что уже думаете об этих ссылках на сборки как о дереве.

У вас есть одна сборка в качестве корня дерева и список ветвей в качестве его компонентов.

У вас может быть функция содержит (Node, ListOfAssemblies), которая возвращает истину тогда и только тогда, когда ни один узел под Node не содержит никакой сборки в ListOfAssemblies. Эта функция может рекурсивно вызывать себя до тех пор, пока не достигнет листа и вернется.

Вам просто нужно выработать (1) логику того, как это работает, и (2) как ваши компоненты и сборки будут представлены в коде.

Удачи!

...