[英]Displaying mutual friends
我在社交媒體網站上工作,除了共同的朋友,我的一切都在友誼中工作。 我不能讓它工作。
這是我的用戶模型:
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,朋友關系+ 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
我認為最好像這樣創建一個單獨的函數
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 的用戶之間的共同朋友
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.