新手:相互喜欢,只有他们是积极的记录?

时间:2012-07-02 12:56:24

标签: ruby-on-rails-3 activerecord mutual-friendship

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

user_id   | likes_id 
1           2                
2           1

Only get results where both of the users likes each other ( friendship )

我已经尝试了一些加入,但无法让它真正起作用,是否有建筑AR功能可以获得上述结果?

4 个答案:

答案 0 :(得分:2)

我认为这就是你要找的东西: ruby on rails getting a 2-way friend relationship in active record?

或者你可以试试这个:

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

答案 1 :(得分:2)

要添加到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')

另一种选择(较慢?但imho看起来更干净)的方法是在你的用户模型中做这个(没有经过测试,但应该给你一个想法):

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 :(得分:1)

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

通过这种方式,您可以创建用户之间的关系,就像我用这个例子来创建媒体公司和公司之间的关系一样,我拥有这个媒体(在我的情况下),媒体可以由公司A拥有,公司A是由B公司拥有,这是您获得自我参照协会的地方。

在你的情况下实现这个更简单,因为你需要用户模型..对我来说需要做更多修改。

答案 3 :(得分:0)

我用

制作了它
 @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

模型中的抽象更好,我稍后会查看