В вашем случае, я думаю, отрицательное условие в объединении будет работать. Таким образом, запрос будет выглядеть так:
SELECT * FROM users
INNER JOIN customers
ON customers.user_id = users.id
INNER JOIN customers_subscriptions
ON customers_subscriptions.customer_id != customers.user_id
GROUP BY users.id
HAVING COUNT(users.id) = 1
Итак, имея:
Пользователи:
+----+-------+------------+----------------------------+----------------------------+
| id | email | name | created_at | updated_at |
+----+-------+------------+----------------------------+----------------------------+
| 1 | NULL | seb | 2019-04-27 19:16:09.043251 | 2019-04-27 19:16:09.043251 |
| 2 | NULL | sab | 2019-04-27 19:16:09.150315 | 2019-04-27 19:16:09.150315 |
| 3 | NULL | washington | 2019-04-27 19:58:01.737446 | 2019-04-27 19:58:01.737446 |
+----+-------+------------+----------------------------+----------------------------+
Клиенты:
+----+------------+-------+---------+----------------------------+----------------------------+
| id | name | email | user_id | created_at | updated_at |
+----+------------+-------+---------+----------------------------+----------------------------+
| 1 | Sab | NULL | 1 | 2019-04-27 19:16:09.254955 | 2019-04-27 20:02:47.636143 |
| 2 | Seb | NULL | 2 | 2019-04-27 19:16:09.313268 | 2019-04-27 20:02:55.741603 |
| 3 | Washington | NULL | 3 | 2019-04-27 19:58:22.711897 | 2019-04-27 19:58:45.213720 |
| 4 | Eminem | NULL | 3 | 2019-04-27 19:58:52.820731 | 2019-04-27 20:03:02.465681 |
+----+------------+-------+---------+----------------------------+----------------------------+
Подписки клиентов:
+----+-------------+----------------------------+----------------------------+
| id | customer_id | created_at | updated_at |
+----+-------------+----------------------------+----------------------------+
| 1 | 1 | 2019-04-27 19:16:10.041788 | 2019-04-27 19:16:10.041788 |
| 2 | 3 | 2019-04-27 20:04:16.464446 | 2019-04-27 20:04:16.464446 |
+----+-------------+----------------------------+----------------------------+
Результат должен быть:
+----+-------+------+----------------------------+----------------------------+----+------+-------+---------+----------------------------+----------------------------+----+-------------+----------------------------+----------------------------+
| id | email | name | created_at | updated_at | id | name | email | user_id | created_at | updated_at | id | customer_id | created_at | updated_at |
+----+-------+------+----------------------------+----------------------------+----+------+-------+---------+----------------------------+----------------------------+----+-------------+----------------------------+----------------------------+
| 1 | NULL | seb | 2019-04-27 19:16:09.043251 | 2019-04-27 19:16:09.043251 | 1 | Sab | NULL | 1 | 2019-04-27 19:16:09.254955 | 2019-04-27 20:02:47.636143 | 2 | 3 | 2019-04-27 20:04:16.464446 | 2019-04-27 20:04:16.464446 |
+----+-------+------+----------------------------+----------------------------+----+------+-------+---------+----------------------------+----------------------------+----+-------------+----------------------------+----------------------------+
Таким образом, код AR для этого может быть:
User.
joins(:customers).
joins('INNER JOIN customers_subscriptions ON customers_subscriptions.customer_id != customers.user_id').
group(:id).
having('COUNT(users.id) = 1')