2011-08-03 36 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