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