2011-08-03 37 views
2

鑑於以下型號的連接訂購的has_many協會:如何通過一列上表

class Menu < ActiveRecord::Base 
    has_many :items 
end 

class Items < ActiveRecord::Base 
    has_and_belongs_to_many :menus 
end 

每個菜單都需要有一個獨立的排序順序爲它的項目

我通常添加連接表上的sort_order列menus_items

我需要創建一個新模型來存儲此信息並添加一個:through關係嗎?

什麼是最好的方式來設置這在Rails中?

+1

如果你想要「訂單」,是的,你需要建立一個新的模型,在這個模型中,你需要保存你想要的每個菜單的數量和狀態等。 – eveevans

+1

是的,這是正確的。您需要添加一個模型以用於連接表,並使用has_many:through。 has_and_belongs_to_many用於非常簡單的橋接關係,您不需要任何此類功能。 – agmcleod

回答

2

是的,你需要創建一個新的MenuItem類和相關的menu_items表。

class Menu 
    has_many :menu_items, :order => 'sort_order' 
    has_many :items, :through => :menu_items 
end 

class MenuItem 
    belongs_to :menu 
    belongs_to :item 
end 

class Item 
    has_many :menu_items 
    has_many :menus, :through => :menu_items 
end 

你menu_items表應該有menu_iditem_idsort_order(或者任何你正在使用作爲您的排序列的名稱)的列。請記住,您需要處理sort_order的設置。根據您的要求,您可以使用acts_as_list plugin或自行滾動邏輯。

+1

非常感謝這個例子!儘管:命令必須在'has_many:items,:through =>:menu_items,:order =>「sort_order」'上工作 – deadkarma