Rails - Действует как вложенный - Обеспечение максимального уровня

В настоящее время я использую драгоценный камень 'nested_set' для обработки комментариев.

Что я хочу сделать, так это не допустить, чтобы уровень комментариев углублялся более чем на 2 уровня. Я устал делать что-то вроде этого:

class Comment < ActiveRecord::Base
    ....
    before_save :ensure_max_nestedset_level
  private

    # We don't want comments to go more than 2 levels deep. That's overkill
    def ensure_max_nestedset_level
      if self.level > 2
        self.level = 2
      end
    end

end

Но похоже, что вы не можете установить уровень, только получите уровень объектов. Цель состоит в том, чтобы обеспечить МАКС. 2 уровня глубины для цепочки комментариев. Может ли кто-нибудь предложить способ принудительного выполнения этого?

Вариант использования:

Comment Main (level 0)

  Comment Reply (level 1)

    Comment Reply about XXXX (level 2)

Когда пользователь отвечает на последний (о XXXX), я не хочу, чтобы для комментария был установлен уровень 3, я хочу ограничить его до 2.

Идеи? Спасибо


person AnApprentice    schedule 18.02.2011    source источник
comment
Кажется, здесь есть некоторые слова, касающиеся уровней: rubydoc.info/gems/nested_set/1.6 .4/frames Пробовали ли вы использовать each_with_level?   -  person Steve    schedule 19.02.2011
comment
@ Стив, спасибо, но я не уверен, что здесь это подходит. Я думаю, что each_with_level предназначен для зацикливания результатов. Где я имею дело с вставкой нового вложенного объекта и желанием предотвратить установку уровня на глубокий. Правильно?   -  person AnApprentice    schedule 19.02.2011


Ответы (1)


Кажется, это работает, хотя может быть лучшее решение.

class Comment < ActiveRecord::Base
  acts_as_nested_set

  after_save :check_level

  def check_level
    if level > 2
      move_to_child_of(parent.parent)
    end
  end
end

Обратите внимание, что изменение этого параметра на before_save приводит к сбою, я не знаю почему. Возможно, это связано с перебалансировкой дерева?

person zetetic    schedule 19.02.2011
comment
Странно, у меня before_save не подводит. Но что не удается, так это IF LEVEL или если self.level (все строчные буквы), всегда возвращает 0 - person AnApprentice; 19.02.2011
comment
Похоже, это потому, что act_as_nested_set запускается после сохранения? Вывод логера объекта комментария before_save показывает: parent_id: 251, lft: nil, rgt: nil - person AnApprentice; 19.02.2011