在这种情况下 - 有什么更好或有很多通过?

时间:2014-07-21 13:55:52

标签: sql ruby-on-rails

我有一道食谱,它有许多杂货

class Dish < ActiveRecord::Base
    has_many :groceries

我在考虑 - 我应该像上面的例子那样简单但是,比方说, 100道菜,每道菜都有西红柿,胡萝卜,黄瓜 - 所以杂货桌会很大 与相同的杂货或我应该使用有很多通过,并制作杂货表 然后联系连接菜肴和杂货,所以杂货桌很小 只有西红柿胡萝卜和咖喱,但连接表将很大,以连接所有的菜肴和杂货。

如果没关系我更喜欢第一个 - 它的编程更简单......

2 个答案:

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