2015-09-27 5 views
1

Я работаю на сайте социальных сетей, и у меня есть все, что работает в дружбе, кроме общих друзей. Я не могу заставить его работать.Отображение общих друзей

Это моя модель пользователя:

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 < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, :class_name => '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 relation how to get the mutual relation? code included, но до сих пор я не могу заставить его работать.

спасибо.

ответ

0

Учитывая, что у вас есть два пользователя, их взаимные друзья просто:

user1.friends & user2.friends 

Или это не то, что вы ищете?

Это может оптимизировать его удобно.

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

Я уже попробовал первый путь и был вопрос, который я не мог Исправить. Здесь: http://stackoverflow.com/questions/32804059/intersection-outputs-the-results-in-view – cyonder

+0

Кажется, что все исправлено сейчас –

0

Если определить взаимными как «общие друзья» для пользователя 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