创建跨越3个模型的友谊建议查询

时间:2011-12-20 21:24:37

标签: sql ruby-on-rails ruby-on-rails-3 activerecord activemodel

我可以使用以下查询的帮助,该查询用于向用户建议朋友

我有三种模式:

User (id, fb_id, org_id)
FbFriends (user_id, fb_id, org_id)
Friendships (user_id, friend_id)

FbFriends正在Facebook上缓存用户的朋友。友谊是我的应用程序的友谊。

目标,根据以下条件返回用户:

  1. 按用户的org_id
  2. 排序
  3. 过滤掉任何人,如果他们已经是两个用户之间的友谊记录。
  4. 是否可以通过一个查询基于上述内容返回@users?或者我是否需要使用多个查询来构建它?

    由于

1 个答案:

答案 0 :(得分:1)

在SQL中你会这样做:

SELECT * FROM users
JOIN friendships friendships_l ON users.id = friendships.user_id
JOIN friendships friendships_r ON users.id = friendships.friend_id 
WHERE {{some_user_id}} <> users.id
  AND {{some_user_id}} <> friendships_l.friend_id,
  AND {{some_user_id}} <> friendships_r.user_id
ORDER BY users.org_id

在ActiveRecord中:

User.
  joins('JOIN friendships friendships_l ON users.id = friendships_l.user_id').
  joins('JOIN friendships friendships_r ON users.id = friendships_r.friend_id').
  where(%[ :uid <> users.id AND
           :uid <> friendships_l.friend_id AND
           :uid <> friendships_r.user_id
         ],
         { :uid => some_user.id }
  ).
  order('users.org_id').all