新手 :获得相互喜欢,并且只有当他们与活跃记录相互喜欢时


获得

相互喜欢的好方法是什么? 其中 2 个用户彼此喜欢(如在朋友列表中),并且只获得那些相互匹配的用户?

user_id   | likes_id 
1           2                
2           1
Only get results where both of the users likes each other ( friendship )

我已经尝试了一些连接,但无法真正使其工作,是否有构建AR功能来获得上述结果?

为了补充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

我认为这就是你要找的:红宝石在轨道上获得活跃记录中的 2 向朋友关系?

或者,您可以尝试以下操作:

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

http://railscasts.com/episodes/163-self-referential-association

通过这种方式,您可以在用户之间创建关系

,就像我使用此示例在媒体公司和拥有此媒体的公司之间创建关系(在我的例子中),其中媒体可以由公司 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

模型中的抽象更好,我稍后会研究

相关内容

最新更新