2017-02-12 3 views
0

Я пытаюсь получить список всех записей, которые не существуют в таблице соединений.Активная запись, если запись таблицы соединений не существует

Модели - Пользователь, Игра и MarkedGame, где пользователи могут отмечать игры как играемые. Это отношения многие ко многим:

User > MarkedGame < Game 

То, что я хочу, это список всех игр, которые не помеченных пользователем.

Я знаю, что я мог бы сделать два отдельных запросов и вычитать их:

Game.all - current_user.games 

Но мне не нравится, что это оставляет меня с массивом, а не активный объект Запись отношения. Плюс, похоже, должен быть более эффективный способ сделать это.

Если нет активного способа записи данных, возможно, существует способ SQL? Мой сырой SQL не особенно силен, поэтому любая помощь в этом будет оценена.

Спасибо.

ответ

1

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

Game.where('id not in (select game_id from marked_games where user_id = ?)', current_user.id) 
+1

Отлично! Спасибо. Так это в основном говорит, где идентификатор игры не находится в подзапросе игровых идентификаторов? –

+0

Да, и это только один запрос, поэтому он довольно быстр, если у вас есть правильные индексы в вашем db. – Iceman

+0

Отлично, спасибо еще раз. Другой ответ поташина также отлично работает, есть ли у вас мнение о том, какое лучшее решение? –

2

Вы можете попробовать следующее:

Game.where.not(id: MarkedGame.where(user_id: current_user.id).pluck(:game_id)) 
+0

Также отлично работает, спасибо! Есть ли у вас мнение о том, лучше или хуже ваше, чем выше? Попытка выяснить, какой из них отмечать как ответ –

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