Почему моя рекурсивная функция не работает?

У меня есть модель рельсов (Комментарий), основанная на neo4j.rb. Мой простой метод должен возвращать количество дочерних элементов, но вместо этого возвращает LocalJumpError (блок не указан (выход)). Что я делаю неправильно?

has_many :both, :children, model_class: Comment, unique: true

def get_number_of_replies
    if children.count == 0
      0
    else
      children.count + children.each.get_number_of_replies
    end
end

person Joe Eifert    schedule 23.02.2015    source источник
comment
Я подозреваю, что вам нужны скобки. См. stackoverflow.com/questions/18623447/   -  person Robert Harvey    schedule 23.02.2015


Ответы (3)


я думаю

children.count + children.each.get_number_of_replies

должно быть

children.count + children.collect(&:get_number_of_replies).sum

Как показывает ваша ошибка, each ожидает блок.

person Brad Werth    schedule 23.02.2015
comment
Это возвращает SystemStackError (слишком глубокий уровень стека), но это определенно правильный путь. EDIT: у меня есть только один вложенный комментарий, поэтому ошибка не может быть в том, что у меня слишком много комментариев. - person Joe Eifert; 23.02.2015
comment
И children.children.count возвращает 0 - person Joe Eifert; 23.02.2015

Вам нужно перебрать всех детей, чтобы получить желаемый результат:

def get_number_of_replies
  if children.count == 0
    0
  else
    total = 0
    children.each do |c|
      total += children.get_number_of_replies
    end
    children.count + total
  end
end
person hbejgel    schedule 23.02.2015

То, что написал Брэд Верт, верно. Проблема также заключалась в том, что, поскольку дочерние соединения работают в обе стороны, я создавал бесконечный цикл. Итак, вот решение:

  has_many :out, :children, model_class: Comment, unique: true
  has_one :in, :child_of, model_class: Comment, unique: true

  def get_number_of_replies
    result = 0
    unless children.count() == 0
      result += children.count
      children.each do |child|
        result += child.get_number_of_replies
      end
    end
    result
  end
person Joe Eifert    schedule 23.02.2015