如何多次加入同一个表?

时间:2016-09-23 00:59:36

标签: ruby-on-rails activerecord

我要查询给定两个用户的共同朋友。下面的查询应该可以解决大部分问题,而友谊表应该是不言而喻的,包含user_idfriend_id

SELECT `users`.* FROM `users`
INNER JOIN `friendships` `a` ON `users`.`id` = `a`.`friend_id`
INNER JOIN `friendships` `b` ON `users`.`id` = `b`.`friend_id`
WHERE `a`.`user_id` = 1 AND `b`.`user_id` = 2

让我感到困惑的是如何编写这种语义ActiveRecord。使用ActiveRecord,您可以加入关联,但只能加入一次。那么你如何在ActiveRecord中尽可能明白地写这个呢?

2 个答案:

答案 0 :(得分:10)

我使用joins的字符串参数:

User.
  joins("INNER JOIN friendships a ON users.id = a.friend_id").
  joins("INNER JOIN friendships b ON users.id = b.friend_id").
  where("a.user_id" => 1, "b.user_id" => 2)

我不知道使用Active Record进行此类连接的更高级别方法。

答案 1 :(得分:-3)

首先,您应该在用户&之间拥有适当的模型关系。的友谊

user model:
 has_many :friendships

friendship model:
 belongs_to :user

与此: 您可以在迭代中获取 activerecords,如:

users = User.all
users.each do |user|
 user.friendships
 .....
end

或者,由特定用户,例如:

user = User.first
user.friendships #returns association

or 

User.first.friendships

对于 2个特定用户(已给定),您可以这样做:

User.where(id: [1,2]) #array of user id, then get the friendship record as above.

希望这有帮助!