Двойной Вложенный Включает - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть структура навигации, хранящаяся в базе данных. Есть две модели Навигации и Навигационные Элементы.

class Navigation < ApplicationRecord

  has_many :navigation_items

  scope :all_items, -> { 
    includes(navigation_items: [:translations, children: :translations])
      .order('navigation_items.position asc')
      .where(navigation_items: { parent_id: nil })
    }

end

class NavigationItem < ApplicationRecord

  has_many :children, class_name: "NavigationItem", foreign_key: "parent_id"
  belongs_to :parent, class_name: "NavigationItem", foreign_key: 'parent_id', optional: true
  belongs_to :navigation
end

Я настраиваю навигацию в контроллере приложения следующим образом

def set_navigation
  @navigations = Navigation.all_items
  @navigation = []
  @footer_navigation = []
  @header_navigation = []

  if (main = @navigations.detect { |n| n.handle == "main" })
    @navigation = main.navigation_items
  end
  if (footer = @navigations.detect { |n| n.handle == "footer" })
    @footer_navigation = footer.navigation_items
  end
  if (header = @navigations.detect { |n| n.handle == "header" })
    @header_navigation = header.navigation_items
  end
end

Затем я перебираю каждый элемент navigation_item в макете с вложенным циклом для дочерних элементов.

Все работает хорошо, кроме одной вещи. Все элементы навигации имеют привязанную к ним позицию. Родительские элементы отображаются в правильном порядке, однако дети не подчиняются порядку. Есть ли способ также расположить дочерние элементы навигации в порядке их расположения?

1 Ответ

0 голосов
/ 18 ноября 2018

попробуйте

вы можете использовать default_scope или ассоциацию condition

class Navigation < ApplicationRecord
  # has_many :navigation_items, -> { where(parent_id: nil).order(position: :asc) }
  has_many :navigation_items, -> { where(parent_id: nil) }

  scope :all_items, -> { includes(navigation_items: [children: :children]) }
end

class NavigationItem < ApplicationRecord

  # has_many :children, -> { order position: :asc }, class_name: "NavigationItem", foreign_key: "parent_id"
  has_many :children, class_name: "NavigationItem", foreign_key: "parent_id"
  belongs_to :parent, class_name: "NavigationItem", foreign_key: 'parent_id', optional: true
  belongs_to :navigation

  default_scope -> { order position: :asc }
end
...