代码之家  ›  专栏  ›  技术社区  ›  Indeed is Trash

在Rails中,有很多人拥有和属于

  •  22
  • Indeed is Trash  · 技术社区  · 17 年前

    在rails中使用has_和_-allows_-to_-many关联而不是has_-many:through有什么明显的错误吗?我知道 these articles describing 差异和解决办法,但它们是从2006年开始的。从我所读到的内容来看,人们似乎认为habtm既旧又笨重,但如果你想要的是一个简单的多对多连接,而不需要任何模型呢?

    思想?

    4 回复  |  直到 17 年前
        1
  •  29
  •   Can Berk Güder Pugalmuni    17 年前

    has_和Own_to_many是指简单的多对多关系。

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

    如果你只是在寻找一个简单的多对多关系,我看不出有任何理由不使用has_和_-belies_-to_-many。

    多对多关系示例:

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

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

    用户属于零个或多个组,并且组中有零个或多个具有列组的成员。

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

    示例间接一对多关系:

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

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

    考虑这些类别:

    食物水果、蔬菜
    水果——苹果、橘子等。
    蔬菜胡萝卜、芹菜等。

    因此:

    食用苹果、桔子、胡萝卜、芹菜等。

        2
  •  3
  •   John Topley    17 年前

    使用没有什么错 has_and_belongs_to_many 如果不需要联接模型。我刚刚在最近的一个项目中使用过它。

        3
  •  3
  •   srboisvert    17 年前

    我永远不会使用HABTM,这不是因为我对优雅有任何顾虑,而是因为我可以想象,即使我现在看不到这一点,我仍然希望在未来为一段关系添加数据。由于懒惰,我希望能够将列添加到联接中,而不必重新处理关系,然后添加列。

        4
  •  3
  •   Jon Galen    15 年前

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

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

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

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

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

    如果您想说某人X拥有项目1并被分配了该项目 在指定日期 ,您突然对该特定关系有了一个正确的认识,并更好地使用HMT。