我计划构建一个复杂的侧边栏菜单,其中包含多层嵌套,显示指向不同类型页面的链接。因此模型
class MenuItem < ApplicationRecord
belongs_to :linkable, polymorphic: true
end
目前显示如下:
现在,为了介绍一个子链接,我想保持在同一个模型中,但是看到结果为:
我不想创建另一个模型或继承,所以我的初步计划是通过向MenuItem
模型添加更多字段来实现:
is_subpage:boolean
show_under:integer
所以这样获得第二层并迭代它我需要做类似的事情:
MenuItem.where(subpage: true, show_under: self.id)
但也许有更好的方法来建立关系?
有点像
belongs_to :self, as: :subpage
让我这样做
MenuItem.subpages => [1, 2, 3]
答案 0 :(得分:3)
在menu_items
表格中添加parent_id&amp;删除is_sub_page
&amp; show_under
字段
class MenuItem < ApplicationRecord
belongs_to :parent, :class_name => 'MenuItem'
has_many :children, :class_name => 'MenuItem', :foreign_key => :parent_id
end
答案 1 :(得分:1)
构建一个树结构,每个项目都知道他的父项。
$ rails g model MenuItem title:string menu_item_id:integer
# models/menu_item.rb
class MenuItem < ApplicationRecord
belongs_to :parent, class_name: 'MenuItem', foreign_key: 'menu_item_id'
# items without parent are the top-level menu items
scope :main_items, -> { where(parent: nil) }
end
查询子项如下:
menu_item = MenuItem.find ..
children = MenuItem.where(parent: menu_item)