2

我正在寻找一种优雅的方法来在 Rails 中建模对称关系(如用户之间的友谊)(尽管这可能更像是一个一般的数据库问题)。我知道几种方法,但没有一种方法看起来很优雅:

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

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

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

    这种方法的问题是看起来很麻烦,而且没有任何东西强制要求友谊将完全由 2 个用户共享。

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

4

1 回答 1

1

我将创建一个模型 Friendship ,它包含作为朋友的用户的外键,您可以通过执行以下操作进行验证,以确保与相同用户只有一个友谊:

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

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

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

于 2012-06-03T19:23:32.893 回答