我正在制作一个facebook克隆。我有一个User模型和一个Request模型,包括(sender,recipient,accepted:boolean)。
如果收件人接受它,则变为“真实”'他们也是朋友。我如何建立以下关系?
has_many :friends, -> { where(accepted: true)}, :foreign_key => :recipient_id or :sender_id
因为如果请求被接受,则无论用户是发件人还是收件人都无关紧要。
答案 0 :(得分:2)
简短回答:不!永远不要试图以这种方式使用or
(我的意思是代码中的任何地方)!他们是控制流操作员。详情由Avdi in his blog详细解释!
答案很长:你可以在self-referential association上关注Ryan bates的这个精彩的轨道广播。
为了维护好友请求。您可以拥有一个模型:FriendRequest
,其列为:state
(如果您想维护请求状态:忽略,阻止,接受,以后等),sender_id
和{{1} }。
应用程序/模型/ user.rb :
receiver_id
应用程序/模型/ friend_request.rb :
has_many friend_requests, foreign_key: :receiver_id # user will be the receiving requests!
has_many sent_requests, foreign_key: :sender_id # user will be the sender, right?
因此,当用户接受请求时,您将其关系添加到belongs_to :receiver, class_name: 'User'
belongs_to :sender, class_name: 'User'
模型。这将更有意义。