Рельсы activerecord, дружеские отношения + inverse_friend отношения, как получить взаимоотношения? код включен

Пытаясь найти взаимоотношения, В отношениях с друзьями, Уже есть друзья и inverse_friends. Но как их объединить, чтобы получить общих друзей? Не могу понять, я попробовал несколько вариантов и долго искал в Интернете, просто не вижу

  has_many :friendships
  has_many :friends, :through => :friendships
  has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
  has_many :inverse_friends, :through => :inverse_friendships, :source => :user

как получить

has_many :mutual_friends ?

3 ответа

Решение

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

Я предполагаю, что мы хотим всех наших друзей, для которых мы их друзья.

class User
  has_many :friendships
  has_many :friends, :through => :friendships
  has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
  has_many :inverse_friends, :through => :inverse_friendships, :source => :user

  def mutual_friends
    inverse_friends.joins(:friendships).where("friendships.user_id = users.id and friendships.friend_id = :self_id", :self_id => id).all
  end
end

Чтобы сделать это как ассоциацию, это то, что вы пытаетесь сделать:

has_many :mutual_friends,
         :through => :inverse_friendships,
         :source => :user,
         :conditions => ["friendships.user_id = users.id and friendships.friend_id = :self_id", :self_id => id]

Проблема заключается в вызове метода id в определении ассоциации has_many: altern_friends.

Вам нужны две модели, чтобы найти общих друзей?

Не могли бы вы просто сделать

@mutualfriends = @user1.friends & @user2.friends

Попробуйте пересечение двух запросов вот нить об этом

Пересечение двух отношений

Другие вопросы по тегам