在rails上用ruby建模对称关系的最佳方法是什么?

问题描述:

我正在寻找一个优雅的方式来模拟在轨道上的(如用户之间的友谊)对称关系(虽然这可能是更多的一般数据库问题)。 我知道的几种方法,但似乎没有一个优雅:在rails上用ruby建模对称关系的最佳方法是什么?

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

  2. 创建友好的表,其中每一行表示的关系,并且:

    • 对于一对之一:添加列到用户表来引用关系
    • 对于多对多:添加一个user_friendship表,该表将持有用户和友谊表的外键。

    这种方法的问题是,这似乎很麻烦,也没有什么强制友谊将由2个用户完全分享。

我希望,还有比这更完美的解决方案。有任何想法吗?

我会创建一个保存谁是朋友,你可以让这确保了只有一个友谊与同一用户只需通过执行类似验证用户的外键的模型友谊:

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

在我看来,这是一个非常优雅的解决方案,它提供了很大的灵活性。结帐has_one:通过关联导轨指南A Guide to Active Record Associations 如果你想建模像友谊。

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

+0

不会强迫我总是从友谊对象的两侧进行查询吗?这个对象有一个用户端和一个朋友端,对吧?所以每当我尝试找到John的所有朋友时,我都需要搜索John是用户的所有友谊对象,或者John是朋友的地方。 – davidrac

+0

那么,你可以为你的用户类编写一个实例方法,它使用一个作用域来查询user_id或friend_id等于用户标识的友谊。然后,当您将用户表包含在范围中时,您可以仅执行user.friends_method。 – jagse

+0

让我知道你是否需要帮助。 – jagse