Ниже этого раздела мой первоначальный ответ; Я неправильно прочитал вопрос и подумал, что OP хотел только список пользователей, которые ПОЛУЧИЛИ сообщения от указанного пользователя; Я также не заметил, что касается также пользователей, которые отправили SENT-сообщения указанному пользователю. Вот мое обновление. Я оставлю исходный ответ ниже, если это поможет.
В этой версии ответа, я изменил бы присоединиться и где положение так, что запрос рассматривается либо sender_id
или recipient_id
колонки:
User.joins("INNER JOIN messages ON (messages.sender_id = users.id OR messages.recipient_id = users.id)")
.where("messages.sender_id = ? OR messages.recipient_id = ?", current_user.id, current_user.id).uniq
Извинения за недоразумение.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Для того, чтобы получить все пользователи, вы связывались, я имею в виду, самый простой подход должен сделать это с помощью обычных активных методов записи запроса. Во-первых, настроить has_many
в вашей User
модели следующим образом:
В вашей User
модели
has_many :messages_sent, class_name: "Message", foreign_key: :sender_id
has_many :messages_received, class_name: "Message", foreign_key: :recipient_id
И потом, вы можете просто запрос с использованием отношения как так:
User.joins(:messages_received).where(:messages=>{sender_id: current_user.id}).uniq
Примечание: замените current_user
тем, что вы используете для хранения целевого пользователя.
Редактировать
Кто-то спросил, почему это лучше, чем при использовании прямого :messages_sent
отношения. Преимущество такого подхода заключается в том, что все это делается на уровне базы данных, где правильное индексирование может выполнять свою работу. Если у вас очень большая таблица, и этот пользователь отправил большое количество сообщений, использование активной записи has_many
будет требовать, чтобы вы перебирали большую коллекцию, пытаясь найти уникальных пользователей.
Просто, чтобы добавить немного больше разъяснений, этот запрос должен отображать запрос SQL, который выглядит примерно так:
SELECT users.*
FROM users INNER JOIN messages ON messages.recipient_id = users.id
WHERE messages.sender_id = 1
В простом английском языке, это в основном говорят, к базе данных: «Пожалуйста, дайте мне все пользователи, которые ПОЛУЧИЛИ сообщение SENT пользователем # 1 ".
имеет много отношение должно быть во множественном числе (message_received_by_users) и принадлежит единственному. –
Означает ли это, что я не могу добиться того, что я хотел бы сделать, используя 'has_many'? – titibouboul