我试图允许我的应用程序中的用户通过朋友请求彼此成为共同的朋友,我对关系如何工作有点困惑...当一个用户创建友谊并被另一个用户接受时,我希望两个用户都可以看到这种友谊(显然) .
我想实现一个允许我做类似于以下内容的实现:
user1 friend requests user2
user2 accepts
user1.friends now contains user2
user2.friends now contains user1
这是我到目前为止所做的,但我已经阅读了一些关于嵌套has_many的奇怪事情:通过关系
class User < ActiveRecord::Base
has_many :friendships
has_many :friends, :class_name => "User", :through => :friendships
end
class Friendship < ActiveRecord::Base
has_many :users, :limit => 2
end
这是一个可行的实施吗?如果没有,我可以改变/改进什么?如果可能的话,我想避免代表一种关系的2行 .
2 回答
您正在寻找的是has_and_belongs_to_many关系,但是对于同一个表,有点像Many-to-many relationship with the same model in rails?详细描述的那样 . 但是,由于您希望关系是双向的("my friends are all also friends with me"),因此您有两种选择:
这不是最干净的方法,但我认为你会发现在设置这样的时候(使用非规范化表)并没有真正特别干净的方法 . 选项1是一个更安全的赌注 . 您还可以通过自动生成每个友谊的镜像条目,使用SQL视图来达到中间位置 .
编辑:API中的迁移和使用
根据下面的OP评论,要完全使用选项1,这是您需要做的:
将该文件编辑为:
创建友谊模型:
然后在您的用户模型上:
在您的API中,请说一个新的FriendshipsController:
你的路线是什么样的(在
config/routes.rb
):并且请求看起来像:
然后,只要您想查找用户是谁的朋友,您就可以参考
current_user.friends
.你用has_many :through:
以上是self-referential join,允许以下内容:
这将为用户添加新的
friendship
,其默认status
设置为pending
. 设置了@user.friends
关联,以便仅通过呼叫显示accepted
个朋友 .因此,您将能够执行以下操作: