在Rails中has_and_belongs_to_many

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

思考?

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

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

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

示例多对多关系:

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

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

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

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

间接一对多关系示例:

类别具有零个或多个子类别,并且每个子类别具有零个或多个项目。

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

考虑以下类别:

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

因此:

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

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

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

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

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

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

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

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

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

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