Я создаю модель категории и использую плагин awesome_nested_set
(замена для acts_as_nested_set
) для работы с иерархией. При awesome_nested_set
объекты создаются, затем сохраняются, а затем помещаются в набор. Кроме того, lft
, rgt
и parent_id
являются attr_protected
, поэтому они не могут быть записаны напрямую.
Я сталкиваюсь с двумя ситуациями, когда помещаю узел в набор, который я хочу иметь возможность перехватить, чтобы уведомить пользователя (может быть, еще кое-что, о чем я еще не думал):
- Попытка размещения узла в качестве собственного дочернего элемента (
self.id == self.parent_id
)
- Узел пытается быть перемещен ниже своего потомка (
self.descendants.include? self.parent_id == true
)
В обоих случаях перемещение завершится неудачно, но awesome_nested_set
вызовет только исключение ActiveRecord::ActiveRecordError
с сообщением, которое не настолько описательно, как я хотел бы дать пользователю.
awesome_nested_set
имеет несколько методов перемещения узлов, которые все вызывают move_to(target, position)
(где position
- это один из :root
, :child
, :left
или :right
, а target
- это связанный узел для всех position
с, но :root
). Метод запускает обратный вызов before_move
, но не предоставляет способа, который я вижу, чтобы проверить движение до того, как оно произойдет. Чтобы проверить ход, мне понадобится доступ к цели и позиции, которые обратный вызов не получает.
Кто-нибудь знает либо о способе проверки хода в awesome_nested_set
(либо путем передачи цели и позиции в обратный вызов before_move
другого метода), либо о другом плагине вложенных множеств, который позволит мне проверки? Я бы предпочел не раскошелиться или написать свой собственный плагин.