【问题标题】:Displaying mutual friends显示共同的朋友
【发布时间】:2015-09-27 14:40:27
【问题描述】:

我在社交媒体网站上工作,除了共同的朋友之外,我的一切都在友谊中工作。我不能让它工作。

这是我的用户模型:

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,但我仍然无法让它工作。

谢谢。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    鉴于您有两个用户,他们共同的朋友很简单:

    user1.friends & user2.friends
    

    或者这不是你想要的?

    这可能会轻松优化它。

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

    【讨论】:

    【解决方案2】:

    如果您将用户 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
    

    【讨论】:

      【解决方案3】:

      我认为像这样创建一个单独的函数会更好

          def mutuals(user)
            a_friends = friends
            b_friends = user.friends
            a_friends.select do |friend|
              b_friends.find_by(friend_id: friend.friend_id)
            end
          end
      

      使用此方法,您可以调用@user.mutual(User.find(3)) 来查找@user 变量和ID 为3 的用户之间的共同朋友

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        相关资源
        最近更新 更多