22

在 rails 中使用 has_and_belongs_to_many 关联而不是 has_many :through 有什么明显错误吗?我知道这些 描述差异和解决方法的文章 ,但它们是从 2006 年开始的。从我在 SO 上阅读的内容来看,似乎人们认为 habtm 既旧又笨重,但如果一个简单的多对多加入没有必要的模型是你要找的吗?

想法?

4

4 回答 4

29

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

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

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

多对多关系示例:

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

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

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

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

间接一对多关系示例:

一个类别有零个或多个子类别,每个子类别有零个或多个项目。

因此,一个类别通过其子类别具有零个或多个项目。

考虑以下类别:

食品→水果、蔬菜
水果→苹果、橙子等
蔬菜→胡萝卜、芹菜等

所以:

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

于 2009-03-18T13:22:33.193 回答
3

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

于 2009-03-18T13:36:48.900 回答
3

我永远不会使用HABTM,不是因为担心优雅,而是因为我总是可以想象将来想在关系中添加数据,即使我现在看不到重点。懒惰的我希望能够将列添加到连接中,而不必重新处理关系然后添加列。

于 2009-03-18T20:54:14.200 回答
3

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

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

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

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

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

因此,如果您只是说人 [XYZ] 拥有并属于项目 [123],但不需要在项目 1 中提及人 X,请使用 HABTM。

如果你想说那个人 X 有项目 1 并且在给定日期被分配了那个项目,那么你突然之间就有了一个适合这种特定关系的关系并更好地使用 HMT。

于 2011-05-25T03:30:17.100 回答