2017-04-20 50 views
1

我已經計劃構建一個複雜的邊欄菜單,其中包含多層嵌套,它顯示指向不同類型頁面的鏈接。因此,這個模型屬於同一模型的模型的實例Rails

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

目前,它這樣表示:

  • 鏈接1
  • 鏈接2
  • 鏈接3

現在,推出一種次級鏈接我會喜歡留在相同的模型,但看到的結果爲:

  • 鏈接1
    • 鏈接一個
    • 鏈路B
  • 鏈路2
    • 路段C
  • 鏈路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] 

回答

3

添加PARENT_ID在menu_items表&刪除is_sub_page & show_under領域

class MenuItem < ApplicationRecord 
    belongs_to :parent, :class_name => 'MenuItem' 
    has_many :children, :class_name => 'MenuItem', :foreign_key => :parent_id 
end 
+0

我接受這個答案,因爲外鍵正確設置,並且has_many在其中。 –

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) 
+1

這可能是有用的添加'的has_many:兒童......也有關係。 – Santhosh

相關問題