如何多次加入同一个表?

mal*_*tor 7 activerecord ruby-on-rails

我正在查询给定两个用户的共同朋友.下面的查询应该在大多数情况下完成,而友谊表应该是不言而喻的,包含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
Run Code Online (Sandbox Code Playgroud)

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

Hen*_*k N 11

我用字符串参数来做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)
Run Code Online (Sandbox Code Playgroud)

我不知道用Active Record进行这种连接的更高级别的方法.


ald*_*n.h -3

首先,您应该在用户友谊之间建立适当的模型关系

user model:
 has_many :friendships

friendship model:
 belongs_to :user
Run Code Online (Sandbox Code Playgroud)

这样:您可以在迭代中获取activerecords,如下所示:

users = User.all
users.each do |user|
 user.friendships
 .....
end
Run Code Online (Sandbox Code Playgroud)

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

user = User.first
user.friendships #returns association

or 

User.first.friendships
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助!