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