在Rails中has_and_belongs_to_many

时间:2009-03-18 13:16:47

标签: ruby-on-rails has-and-belongs-to-many

在rails而不是has_many:through中使用has_and_belongs_to_many关联有什么明显错误吗?我知道these articles describing的差异和解决方法,但它们是从2006年开始的。从我读过的东西来看,似乎有人认为habtm已经过时了笨重,但是如果一个简单的多对多加入没有必要的模型是你正在寻找什么?

思想?

4 个答案:

答案 0 :(得分:29)

has_and_belongs_to_many用于简单的多对多关系。

另一方面,

has_many:through用于间接的一对多关系,或与属性的多对多关系。

如果您只是寻找简单的多对多关系,我看不出有任何理由不使用has_and_belongs_to_many。

多对多关系示例:

用户属于零个或多个组,组有零个或多个成员(用户)。

与属性的多对多关系示例:

用户属于零个或多个组,并且组具有零个或多个具有等级的成员。

例如,Alice可能是A组的管理员,B组的主持人。您可以在连接表中保留此属性。

间接一对多关系示例:

类别包含零个或多个子类别,每个子类别包含零个或多个项目。

因此,某个类别的子类别中包含零个或多个项目。

考虑以下类别:

  

食物→水果,蔬菜
  水果→苹果,橙子等   蔬菜→胡萝卜,芹菜等

因此:

  

食物→苹果,橙子,胡萝卜,芹菜等

答案 1 :(得分:3)

如果您不需要连接模型,使用has_and_belongs_to_many没有任何问题。我刚刚在最近的一个项目中使用它。

答案 2 :(得分:3)

我永远不会使用HABTM而不是因为对优雅的任何关注,而是因为我总能想象未来想要在关系中添加数据,即使我现在看不到这一点。懒惰我希望能够只将列添加到连接中,而不必重新设置关系,然后添加列。

答案 3 :(得分:3)

我这样想。假设您已经发现需要多对多模型:

X----1
  __/
 /
Y----2
  __/
 /  
Z----3

(x-> 1 y-> 1,2 z-> 2,3)

如果您不需要存储我上面(希望可识别的)图片中每条线的信息,请使用HABTM关系。

如果您需要存储有关这些行(关系)的信息,请使用“通过”。

因此,如果您只是说人们[XYZ]拥有并属于项目[123],但不需要在项目1中说出关于X的任何内容,请使用HABTM。

如果你想说X人有项目1并且在给定日期分配了该项目,那么你突然对该特定关系有了适当的关系,并且更好地使用HMT。