什么是获得相互喜欢的好方法?其中 2 个用户彼此喜欢(如在朋友列表中)并且只获得那些相互匹配的用户?
user_id | likes_id
1 2
2 1
Only get results where both of the users likes each other ( friendship )
我已经尝试了一些连接,但不能真正让它工作,是否有构建 AR 功能来获得上述结果?
什么是获得相互喜欢的好方法?其中 2 个用户彼此喜欢(如在朋友列表中)并且只获得那些相互匹配的用户?
user_id | likes_id
1 2
2 1
Only get results where both of the users likes each other ( friendship )
我已经尝试了一些连接,但不能真正让它工作,是否有构建 AR 功能来获得上述结果?
我认为这就是您要寻找的: ruby on rails 在活动记录中获得 2-way 朋友关系?
或者你可以试试这个:
SELECT a.user_id
FROM likes AS a
INNER JOIN likes AS b
ON a.user_id=b.likes_id
AND a.likes_id=b.user_id
要添加到 jexact 的答案,这是您可以使用 AR 执行此操作的一种方法:
Like.joins('join likes l on likes.user_id=l.likes_id and l.user_id=likes.likes_id')
或者
Like.select('l.*').joins('join likes l on likes.user_id=l.likes_id and l.user_id=likes.likes_id')
另一种(较慢?但恕我直言看起来更干净)的方法是在您的用户模型中执行此操作(未经测试,但应该给您一个想法):
class User < ActiveRecord::Base
has_many :likes
has_many :friends, :through => :likes
has_many :liked_by, :foreign_key => 'likes_id', :class_name => 'Like'
has_many :followers, :through => :liked_by, :source => :user
def mutually_likes?(user)
self.friends.include?(user) && self.followers.include?(user)
end
end
http://railscasts.com/episodes/163-self-referential-association
这样你就可以在用户之间建立关系,就像我用这个例子来建立媒体公司和公司之间的关系一样,hwo 拥有这个媒体(在我的情况下),其中媒体可以由公司 A 拥有,公司 A 由公司拥有B 这就是你得到自我参照协会的地方。
在您的情况下,实现这一点要简单得多,因为您需要用户模型。对我来说,需要进行更多修改。
我用
@groups = Like.select('l.*').joins('join likes l on likes.user_id=l.likes and l.user_id=likes.likes')
unless @groups.empty?
@groups.each do |group|
friendship = Friendship.create(user_id: group.user_id, friend_id: group.likes)
end
end
模型中的抽象更好我稍后会研究