2015-06-30 3 views
1

Я работаю над чат-приложением, встроенным в Rails. Для того, чтобы показать список последних чатов я это делаю:Выбор записей на основании того, что определенные записи не существуют

chats = Chat.where(user_to_id: params[:user_id]).select(:user_from_id).distinct 

Что это делает тянет user_from_id из таблицы чатов, где user_to_id является текущим пользователем.

Проблема в том, что в этом случае будут отображаться чаты, в которых пользователь, с которым разговаривал этот человек, ответил.

Мне нужно изменить этот запрос или написать новый запрос, который также выводит записи чата, даже если нет ответа от другого человека. Любые мысли здесь?

+0

Как ответ чата указан в таблице? Возможно, вы могли бы перефразировать это более общим образом, например. «Я хочу получить записи, где user_from_id NULL» – zetetic

+0

Возможно, вы также ищете записи, в которых пользователь user_from_id является текущим пользователем? –

ответ

0

Вы можете использовать левое внешнее соединение, начиная с таблицы пользователя. Это будет включать запись пользователя независимо от того, есть ли запись чата.

Код будет примерно:

User.joins("left out join chats on (users.id = chats.user_to_id)").where("users.id = ?", params[:user_id]) 

Однако, я думаю, что это может быть проще просто настроить has_many: incoming_chats на модели пользователя, используя что-то вроде:

has_many :incoming_chats, foreign_key: "user_to_id" 

Тогда вы можете просто найдите своего текущего пользователя и получите их входящие чаты:

User.find(params[:user_id]).incoming_chats 
0

Вы можете получить доступ ко всем чатам w Ith user_to_id или user_from_id и получить другое значение:

User.select("IF(user_to_id = #{params[:user_id]}, user_from_id, user_to_id) user_id").where('user_from_id = :u_id OR user_to_id = :u_id', u_id: params[:user_id]).distinct 

Если вы хотите, вы можете быть немного умнее, и выбрать всех пользователей (от & к) и удалить идентификатор после запроса.

Смежные вопросы