Подтвердить что ты не робот

Rails ActiveRecord возвращает записи, где id существует в связанной таблице

У меня есть модель клиента и модель продукта, где у Клиента есть много Продуктов, а Продукт принадлежит клиенту.

Мне нужно найти запрос, который возвращает только клиенты, если у них есть запись в таблице Product

таблица клиентов

id |      name
--------------
 1 | Company A
 2 | Company B
 3 | Company C

таблица продуктов

id |      name |  client_id
---------------------------
 1 | Product A |         1
 2 | Product B |         1
 3 | Product C |         3
 4 | Product D |         3
 5 | Product E |         1

Мне нужны только клиенты 1 3

Например, что-то вроде

@clients = Client.where("client exists in products")  #something to this effect
4b9b3361

Ответ 1

Простейший, но не самый быстрый:

Client.where(:id => Product.select(:client_id).map(&:client_id))

Подзапрос SQL (быстрее):

Client.where("EXISTS(SELECT 1 from products where clients.id = products.client_id)")

Ответ 2

Вот решение, которое использует Where Exists gem (раскрытие: я его автор):

Client.where_exists(:products)

Ответ 3

Здесь другое решение. Это подзапрос, как второе решение Valery, но без написания sql:

Client.where(Product.where(client_id: Client.arel_table[:id]).exists)