我正在寻找一种优雅的方式来模拟rails中的对称关系(如用户之间的友谊)(尽管这可能更像是一般的数据库问题)。 我知道几种方法,但似乎都不优雅:
使用用户的外键创建user_user关系表。我不喜欢它,因为它本质上是一个不对称的解决方案。我看到一种方法强制具有较低id的用户进入第一列而另一种强制进入第二列,并使用union从两端查询关系。这感觉就像是黑客。
创建一个友谊表,其中每一行代表一个关系,并且:
这种方法的问题似乎很麻烦,而且没有任何事情可以强制说明友情将由2位用户完全分享。
我希望有一个比这些更优雅的解决方案。任何想法?
答案 0 :(得分:1)
我会创建一个模型友谊,其中包含作为朋友的用户的外键,您可以进行验证,确保只需通过以下操作即可与同一用户建立友谊:
validates :friend_id, :uniqueness => { :scope => :user_id }
在我看来,这是一个非常优雅的解决方案,提供了很多灵活性。在rails指南A Guide to Active Record Associations中查看has_one:through关联 如果你想模仿友谊之类的东西。
当然还有has_and_belongs_to_many关联。但它没有提供像创建模型那样多的灵活性,因此通常不是一个好主意。