2016-09-23 62 views
1

我在查询给定两个用户的共同朋友。下面的查询大部分都应该这样做,友谊表应该是不言而喻的,其中包含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

首先,你应该有适当的模型关系用户友好之间 &

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. 

希望这会有所帮助!

+0

没有。对不起,这不回答我的问题,并没有帮助。 – maletor

5

我用字符串参数做它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) 

我不知道更高级别的方式做这样一个有活动记录加入。

+0

也许值得一提的是,连接两次意味着“a”和“b”实际上可以是相同的记录,除非你有一个条件来解决这个问题。上面的条件将它排除在外(因为它为两者指定了不同的ID)。像where(“a.id!= b.id”)这样的条件也会排除。 –