Ruby / Rails: определить, насколько глубоко вложен объект - PullRequest
1 голос
/ 04 марта 2011

Я думаю, что это общий вопрос ruby, хотя в моем случае задействованные объекты - это модели ActiveRecord.

Если у меня есть модель, которая может быть вложена в другую модель, как я могу определить, насколько глубоко вложеннаямодель?

IE:

Model Root (Level 0)
- Model Level 1
- - Model Level 2
- - Model Level 2
- - Model Level 2
- - - Model Level 3
- - - Model Level 3
- Model Level 1
- Model Level 1

Например, foo - это модель, вложенная в три уровня глубиной (как показано выше).Если бы я позвонил foo.parent.parent.parent, я бы получил корневую модель.

Как я мог бы определить такой метод, как: foo.depth, который бы возвратил, сколько уровней существует между foo и его корнем?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Примерно так должно получиться:

def depth
  parent.nil? ? 0 : 1+parent.depth
end
0 голосов
/ 04 марта 2011

Вам необходимо создать рекурсивный метод . Что-то вроде:

class Sample

  attr_accessor :parent

  def depth

    # Base case.
    return 0 if parent.nil?

    # Recursive case.
    return parent.depth + 1

  end

end

Это предполагает, что ваш родительский класс всегда будет реагировать на 'глубину'. Если нет, вам нужно сделать несколько проверок на respond_to?.

...