Изменение родительского объекта при использовании accepts_nested_attributes_for - PullRequest
0 голосов
/ 28 марта 2019

У меня есть меню с menu_items, и эти menu_items могут открыть больше меню.Таким образом, вы можете видеть вложенную иерархию пунктов меню, которые открывают более глубокие меню.Проблема в том, что GUI - это перетаскивание, и я бы хотел, чтобы мои пользователи могли перетаскивать элементы меню из одного меню в другое.

У меня есть структура данных:

menu.rb

has_many: menu_items
has_one :menu_item, foreign_key: :submenu_id, dependent: :nullify
accepts_nested_attributes_for :menu_items, allow_destroy: true

menu_item.rb

  belongs_to :menu
  belongs_to :submenu, class_name: 'Menu'
  accepts_nested_attributes_for :submenu, allow_destroy: true

С этим я могу получить menu_itemпринадлежат меню и указывают на новое меню.Дайте мне это в моем menu_params:

 def menu_params
    params.require(:menu).permit(
      :id,
      :title,
      :menu_type,
      menu_items_attributes: [
        :id,
        :menu_id,
        :order,
        :title,
        :_destroy,
        submenu_attributes: [
          :id,
          :title,
          :menu_type,
          menu_items_attributes: [
            :id,
            :menu_id,
            :order,
            :title,
            :active,
            :_destroy,
            submenu_attributes: [
              :id,
              :title,
              :menu_type,
              menu_items_attributes: [
                :id,
                :menu_id,
                :order,
                :title,
                :active,
                :_destroy,
              ]
            ]
          ]
        ]
      ]
    )
  end

Теперь все работает при создании нового menu_item или изменении его порядка.У меня проблема, если я переместить menu_item из одного меню в другое.Кажется, что активная запись выполняет сложный поиск для menu_item на основе его идентификатора и идентификатора родительского меню ... и поскольку этот идентификатор родительского меню изменяется в новом ответе, я получаю:

Couldn't find MenuItem with ID=104 for Menu with ID=22

(Таким образом, элемент menu_item раньше принадлежал меню 21, но я перетащил его в пользовательский интерфейс в новую позицию под меню 22 ... но он все еще ищет его только из старой позиции)

Есть ли решение, в котором он будет видеть вложенный menu_item и найдет его на основе исключительно его идентификатора, а затем обновит поле родительского menu_id?

...