属于同一模型Rails的模型的实例

时间:2017-04-20 08:34:07

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5

我计划构建一个复杂的侧边栏菜单,其中包含多层嵌套,显示指向不同类型页面的链接。因此模型

class MenuItem < ApplicationRecord
  belongs_to :linkable, polymorphic: true
end

目前显示如下:

  • Link 1
  • Link 2
  • Link 3

现在,为了介绍一个子链接,我想保持在同一个模型中,但是看到结果为:

  • 链接1
    • 链接
    • 链接b
  • 链接2
    • 链接c
  • Link 3

我不想创建另一个模型或继承,所以我的初步计划是通过向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]

2 个答案:

答案 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)