В приложении Rails с Postgres у меня есть таблица пользователей, вакансий и подписчиков. Я хочу выбрать задания, за которыми не следует указанный пользователь c. Но также и задания без строк в объединяемой таблице.
Таблицы:
users:
id: bigint (pk)
jobs:
id: bigint (pk)
followings:
id: bigint (pk)
job_id: bigint (fk)
user_id: bigint (fk)
Данные:
sandbox_development=# SELECT id FROM jobs;
id
----
1
2
3
(3 rows)
sandbox_development=# SELECT id FROM users;
id
----
1
2
sandbox_development=#
SELECT id, user_id, job_id FROM followings;
id | user_id | job_id
----+---------+--------
1 | 1 | 1
2 | 2 | 2
(2 rows)
Ожидаемый результат
# jobs
id
----
2
3
(2 rows)
Могу ли я создать запрос на присоединение, эквивалентный этому?
sandbox_development=#
SELECT j.id FROM jobs j
WHERE NOT EXISTS(
SELECT 1 FROM followings f
WHERE f.user_id = 1 AND f.job_id = j.id
);
id
----
2
3
(2 rows)
Какая работа, но PITA для создания с ActiveRecord.
Пока что я иметь:
Job.joins(:followings).where(followings: { user_id: 1 })
SELECT "jobs".* FROM "jobs"
INNER JOIN "followings"
ON "followings"."job_id" = "jobs"."id"
WHERE "followings"."user_id" != 1
Но поскольку это внутреннее соединение, оно не включает задания без подписчиков (идентификатор задания 3). Я также пробовал различные попытки внешних объединений, которые либо дают все строки, либо не содержат строк.