Новичок: получать взаимные лайки и только если они взаимны с активной записью?

Что было бы хорошим способом получить взаимные симпатии? где 2 пользователя любят друг друга (как в списке друзей) и получают только тех пользователей, у которых есть взаимное совпадение?

user_id   | likes_id 
1           2                
2           1

Only get results where both of the users likes each other ( friendship )

Я попробовал некоторые соединения, но не могу заставить их работать, есть ли функция AR здания, чтобы получить вышеуказанные результаты?

4 ответа

Решение

Чтобы добавить ответ jexact, это один из способов сделать это с помощью AR:

Like.joins('join likes l on likes.user_id=l.likes_id and l.user_id=likes.likes_id')

или же

Like.select('l.*').joins('join likes l on likes.user_id=l.likes_id and l.user_id=likes.likes_id')

Альтернативный (более медленный, но imho выглядит чище) способ сделать это в вашей пользовательской модели (НЕ проверено, но должно дать вам представление):

class User < ActiveRecord::Base
  has_many :likes
  has_many :friends, :through => :likes

  has_many :liked_by, :foreign_key => 'likes_id', :class_name => 'Like'
  has_many :followers, :through => :liked_by, :source => :user

  def mutually_likes?(user)
    self.friends.include?(user) && self.followers.include?(user)
  end
end

Я думаю, что это то, что вы ищете: ruby on rails получает двухсторонние дружеские отношения в активной записи?

В качестве альтернативы вы можете попробовать это:

SELECT     a.user_id
FROM       likes AS a
INNER JOIN likes AS b
ON         a.user_id=b.likes_id
AND        a.likes_id=b.user_id

http://railscasts.com/episodes/163-self-referential-association

таким образом, вы можете создавать отношения между пользователями, как я использовал этот пример для создания отношений между медиакомпаниями и компаниями, у которых есть эти медиа (в моем случае), где медиа могут принадлежать компании A, а компания A - компании Б, и именно здесь вы получаете ассоциацию самоссылки.

В вашем случае гораздо проще реализовать это, так как вам нужны пользовательские модели.. для меня потребовалось больше модификаций, чтобы сделать.

Я сделал это с

 @groups = Like.select('l.*').joins('join likes l on likes.user_id=l.likes and   l.user_id=likes.likes')

  unless @groups.empty?
    @groups.each do |group|
      friendship = Friendship.create(user_id: group.user_id, friend_id: group.likes)
    end
  end

Абстракция в модели более приятна, я изучу это позже

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