2015-02-23 3 views
-1

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

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 
+0

Я подозреваю, что вам нужны скобки. См. Http://stackoverflow.com/questions/18623447/block-syntax-difference-causes-localjumperror-no-block-given-yield –

ответ

1

Я думаю

children.count + children.each.get_number_of_replies 

должен быть

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

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

+0

Это возвращает SystemStackError (уровень стека слишком глубокий), но, безусловно, правильный путь , EDIT: У меня есть только один вложенный комментарий, поэтому ошибка не может быть такой, что у меня слишком много комментариев. – Johannes

+0

И возвращает children.children.count 0 – Johannes

1

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

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 
0

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

Смежные вопросы