Ответ 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)")
У меня есть модель клиента и модель продукта, где у Клиента есть много Продуктов, а Продукт принадлежит клиенту.
Мне нужно найти запрос, который возвращает только клиенты, если у них есть запись в таблице 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
Простейший, но не самый быстрый:
Client.where(:id => Product.select(:client_id).map(&:client_id))
Подзапрос SQL (быстрее):
Client.where("EXISTS(SELECT 1 from products where clients.id = products.client_id)")
Вот решение, которое использует Where Exists gem (раскрытие: я его автор):
Client.where_exists(:products)
Здесь другое решение. Это подзапрос, как второе решение Valery, но без написания sql:
Client.where(Product.where(client_id: Client.arel_table[:id]).exists)