Создание запроса предложения дружбы, который охватывает 3 модели

Я мог бы использовать помощь со следующим запросом, который предназначен для предложения друзей пользователю

У меня три модели:

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

FbFriends кэширует друзей пользователя на Facebook. Дружба — это дружба в моем приложении.

Цель: вернуть пользователей на основе следующих условий:

  1. Отсортировано по org_id пользователя
  2. Отфильтруйте всех, если они уже являются записью дружбы между двумя пользователями.

Можно ли вернуть @users на основе вышеизложенного одним запросом? Или мне нужно построить это с несколькими запросами?

Спасибо


person Rachela Meadows    schedule 20.12.2011    source источник
comment
Добавление примера вывода помогло бы, я не думаю, что сам запрос сложен, но я не уверен на 100%, что вы ищете. Это просто список org_id, user_id, ‹потенциальные новые друзья›?   -  person Sparky    schedule 21.12.2011
comment
Я ищу выход Users. Список пользователей из пользовательской таблицы на основе условий выше. Это ясно?   -  person Rachela Meadows    schedule 21.12.2011
comment
Вы хотите видеть пользователей в таблице пользователей без друзей ни в FBfriends, ни в Friendships? Или вы хотите видеть для каждого пользователя список возможных друзей (других пользователей, с которыми они еще не дружат?)   -  person Sparky    schedule 21.12.2011
comment
Спарки, это должно помочь. Имеет ли это? ;;; Извини за это. Учитывая пользователя. Сначала мне нужны все пользователи моего приложения, которые являются их друзьями FB. Это обеспечивается моделью FbFriends. Я бы хотел, чтобы это отсортировалось по org_id, чтобы элементы вверху находились в той же организации, что и current_user. Затем я хочу удалить из этого списка всех пользователей, которые уже являются друзьями current_users в моем приложении (дружба). Это помогает   -  person Rachela Meadows    schedule 21.12.2011


Ответы (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

В АктивРекорд:

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
person Jordan Running    schedule 20.12.2011
comment
Спасибо, но это, похоже, не учитывает FbFriends или org_id? - person Rachela Meadows; 21.12.2011
comment
Кроме того, возникает ошибка PGError: ОШИБКА: недопустимая ссылка на запись FROM-предложения для таблицы дружеских отношений СТРОКА 1: ...ers ​​JOINFriendsFriends_l ON users.id =Friendly... ^ ПОДСКАЗКА: Возможно, вы имели в виду ссылку на псевдоним таблицы friends_l . - person Rachela Meadows; 21.12.2011
comment
Спасибо, я попробовал версию для рельсов, это возвращает мою текущую дружбу, которую я не хочу. - person Rachela Meadows; 21.12.2011
comment
Ваш вопрос не дает понять, как FbFriends должен участвовать в результате. Все, что вы говорите, это то, что FbFriends кэширует друзей пользователя на Facebook, что кажется неуместным. Вы можете уточнить? - person Jordan Running; 21.12.2011
comment
Извини за это. Учитывая пользователя. Сначала мне нужны все пользователи моего приложения, которые являются их друзьями FB. Это обеспечивается моделью FbFriends. Я бы хотел, чтобы это отсортировалось по org_id, чтобы элементы вверху находились в той же организации, что и current_user. Затем я хочу удалить из этого списка всех пользователей, которые уже являются друзьями current_users в моем приложении (дружба). Это помогает? - person Rachela Meadows; 21.12.2011