在轨道上建立与ruby对称关系的最佳方法是什么?

时间:2012-06-03 17:51:03

标签: sql ruby-on-rails database schema modeling

我正在寻找一种优雅的方式来模拟rails中的对称关系(如用户之间的友谊)(尽管这可能更像是一般的数据库问题)。 我知道几种方法,但似乎都不优雅:

  1. 使用用户的外键创建user_user关系表。我不喜欢它,因为它本质上是一个不对称的解决方案。我看到一种方法强制具有较低id的用户进入第一列而另一种强制进入第二列,并使用union从两端查询关系。这感觉就像是黑客。

  2. 创建一个友谊表,其中每一行代表一个关系,并且:

    • 一对一:在users表中添加一列以引用该关系
    • 对于多对多:添加一个user_friendship表,该表将外键保存到用户和友谊表。

    这种方法的问题似乎很麻烦,而且没有任何事情可以强制说明友情将由2位用户完全分享。

  3. 我希望有一个比这些更优雅的解决方案。任何想法?

1 个答案:

答案 0 :(得分:1)

我会创建一个模型友谊,其中包含作为朋友的用户的外键,您可以进行验证,确保只需通过以下操作即可与同一用户建立友谊:

validates :friend_id, :uniqueness => { :scope => :user_id }

在我看来,这是一个非常优雅的解决方案,提供了很多灵活性。在rails指南A Guide to Active Record Associations中查看has_one:through关联 如果你想模仿友谊之类的东西。

当然还有has_and_belongs_to_many关联。但它没有提供像创建模型那样多的灵活性,因此通常不是一个好主意。