展现共同的朋友

我正在社交媒体网站上工作,除了共同的朋友,我还有一切都在友谊中工作。 我不能让它发挥作用。

这是我的用户模型:

has_many :friendships has_many :friends, -> { where(friendships: {status: 'accepted'}).order('created_at') }, :through => :friendships has_many :requested_friends, -> { where(friendships: {status: 'requested'}).order('created_at') }, :through => :friendships, :source => :friend has_many :pending_friends, -> { where(friendships: {status: 'pending'}).order('created_at') }, :through => :friendships, :source => :friend 

友谊模特:

 class Friendship  'User', :foreign_key => 'friend_id' validates_presence_of :user_id, :friend_id # Create a friendship request. def self.send_request(user, friend) unless user == friend or Friendship.exists?(user, friend) transaction do create(:user => user, :friend => friend, :status => 'pending') create(:user => friend, :friend => user, :status => 'requested') end end end # Accept a friend request. def self.accept_request(user, friend) transaction do accept_one_side(user, friend) accept_one_side(friend, user) end end # Decline a request, disconnect or cancel a pending request. def self.breakup(user, friend) transaction do destroy(find_by_user_id_and_friend_id(user, friend)) destroy(find_by_user_id_and_friend_id(friend, user)) end end # Return true if the users are (possibly pending) friends. def self.exists?(user, friend) not find_by_user_id_and_friend_id(user, friend).nil? end private # Update the db with one side of an accepted friendship request. def self.accept_one_side(user, friend) request = find_by_user_id_and_friend_id(user, friend) request.status = 'accepted' request.save! end end 

我试过这个: rails activerecord,friend relation + inverse_friend关系如何获得相互关系? 代码包括但仍然无法使其工作。

谢谢。

鉴于您有两个用户,他们的共同朋友只是:

 user1.friends & user2.friends 

或者这不是你想要的?

这可能会轻松优化它。

 user1.friends.where(users: {id: user2.friends.pluck(:id)}) 

如果您将用户a和用户b “共同朋友”定义为“共同朋友”,那么此方法应该可以解决问题:

 class Friendship def self.mutual(a,b) a.friends.joins('INNER JOIN friendships f2 on friendships.friend_id = f2.friend_id') .where('f2.user_id=? and f2.status = ?', b.id, 'accepted') end end