我有一道食谱,它有许多杂货
class Dish < ActiveRecord::Base
has_many :groceries
我在考虑 - 我应该像上面的例子那样简单但是,比方说, 100道菜,每道菜都有西红柿,胡萝卜,黄瓜 - 所以杂货桌会很大 与相同的杂货或我应该使用有很多通过,并制作杂货表 然后联系连接菜肴和杂货,所以杂货桌很小 只有西红柿胡萝卜和咖喱,但连接表将很大,以连接所有的菜肴和杂货。
如果没关系我更喜欢第一个 - 它的编程更简单......
答案 0 :(得分:6)
“有很多通过”的优点是双重的......
首先,由于杂货项目是餐桌驱动的,你最大限度地减少拼写错误和食谱中的变幻莫测(例如,一个食谱有“西红柿”,另一个食谱有“西红柿”)
第二,如果你让它有很多通过你可以使它成为一种双向关系,所以你可以做...
carrots = Grocery.find_by(name: "carrots")
carrots.recipes # show all the recipes using carrots
答案 1 :(得分:0)
<强>许多对多强>
您通常希望在Rails中使用many-to-many
加入此类内容,除非您实际上每次{em>创建 groceries
{ {1}},这将是非常低效的&amp; &#34; WET&#34;
在我看来,将两种类型的数据关联起来的方式是使用连接模型 - 有两种方法可以做到这一点:
根据系统的工作方式,dish
可能比has_many :through
稍微多一些;它的好处是你可以为每个连接记录附加大量不同的数据,而has_and_belongs_to_many
只关联两种类型的记录
<强> has_and_belongs_to_many 强>
如果您不必为联接表添加任何特定详细信息,那么您将要使用has_and_belongs_to_many
:
has_and_belongs_to_many
这将允许您创建下表:
#app/models/dish.rb
Class Dish < ActiveRecord::Base
has_and_belongs_to_many :groceries
end
#app/models/grocery.rb
Class Grocery < ActiveRecord::Base
has_and_belongs_to_many :dishes
end
因此,您可以拨打以下电话:
#dishes_groceries
dish_id | grocery_id
-
has_many:通过
如果你想使用@dish = Dish.find params[:id]
@dish.grocies.each do |grocery|
grocery.name #-> "Carrot"
end
,你必须制作一个单独的模型,这将允许你包含其他属性(因为它的附表将有一个primary_key):
has_many :through