has_and_belongs_to_many 用于简单的多对多关系。
而 has_many :through 则用于间接的一对多关系,或带有属性的多对多关系。
如果您只需要一个简单的多对多关系,我看不出使用 has_and_belongs_to_many 的任何理由。
例子:多对多关系
用户属于零个或多个群组,而群组具有零个或多个成员(用户)。
例子:具有属性的多对多关系
用户属于零个或多个群组,而群组具有零个或多个拥有职级的成员。
例如,Alice 可能是 Group A 中的管理员和 Group B 中的版主。您可以在联接表中保存此属性。
例子:间接的一对多关系
一个类别有零个或多个子类别,每个子类别都有零个或多个项。
因此,每个类别都通过其子类别具有零个或多个项。
考虑以下类别:
食品 → 水果、蔬菜
水果 → 苹果、橘子等
蔬菜 → 胡萝卜、芹菜等
因此:
食品 → 苹果、橘子、胡萝卜、芹菜等。
我这样考虑。假设你已经发现需要一个多对多的模型:
X----1
__/
/
Y----2
__/
/
Z----3
(x->1 y->1,2 z->2,3)
如果您不需要存储有关上图中每行的信息,则使用HABTM关系。
如果您需要存储这些行(关系)的信息,请使用“through”。
因此,如果您只是说人们[XYZ]拥有并属于项目[123],但不需要在项目1上说任何关于X的事情,请使用HABTM。
如果您想说人X在给定日期被分配了项目1,并且要为该特定关系创建适当的数据,则最好使用HMT。
has_and_belongs_to_many
是没有问题的。我最近在一个项目中就使用了它。accept_nested_attribute_for
中使用它?谢谢。 - hqt我不会使用HABTM,不是因为对优雅的担忧,而是因为即使现在看不到点,我总能想象未来想要向关系中添加数据。因为懒惰,我希望只需将列添加到连接中,而无需重新设计关系并添加列。
accept_nested_attribute_for
中使用它?谢谢。 - hqt