【问题标题】:has_and_belongs_to_many in Rails在 Rails 中 has_and_belongs_to_many
【发布时间】:2009-03-18 13:16:47
【问题描述】:

在 rails 中使用 has_and_belongs_to_many 关联而不是 has_many :through 有什么明显错误吗?我知道thesearticlesdescribing 的差异和解决方法,但它们是从 2006 年开始的。从我在 SO 上阅读的内容来看,似乎人们认为 habtm 既旧又笨重,但如果不需要模型的简单多对多连接是您正在寻找的吗?

想法?

【问题讨论】:

    标签: ruby-on-rails has-and-belongs-to-many


    【解决方案1】:

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

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

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

    多对多关系示例:

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

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

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

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

    间接一对多关系示例:

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

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

    考虑以下类别:

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

    因此:

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

    【讨论】:

    • 要了解递归,您必须先了解递归。我认为您的答案可能更清楚或更清楚地说明与属性的多对多关系与没有属性的多对多关系。
    • 您如何将它与accept_nested_attribute_for 一起使用?谢谢
    【解决方案2】:

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

    【讨论】:

    • 您如何将它与accept_nested_attribute_for 一起使用?谢谢
    【解决方案3】:

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

    【讨论】:

    • 从来没有?真的吗?就像“我从不使用 goto”中的从不一样?
    • 我想如果我能想出一个逻辑上不可能向其中添加数据的关系,我可能会选择使用 HABTM。否则,我会选择 has_many: through。
    【解决方案4】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多