Как сделать "где существует" в Ареле

Как вы выполняете запрос, который включает в себя "где существует" в Arel? Например, по запросу, подобному этому, чтобы показать всех поставщиков по крайней мере с одним заказом:

SELECT *
FROM suppliers
WHERE EXISTS
  (SELECT *
    FROM orders
    WHERE suppliers.supplier_id = orders.supplier_id);

Я вижу "существует" в документах Arel http://rubydoc.info/gems/arel/2.0.7/Arel/Nodes/Exists, но у меня возникают проблемы с его использованием.

Ответы

Ответ 1

Здесь вы идете:

suppliers= Supplier.arel_table
orders= Order.arel_table
suppliers_with_orders = Supplier.where(
                          Order.where(orders[:supplier_id]
                                        .eq(suppliers[:id])).exists).to_sql =>
"SELECT `suppliers`.* FROM `suppliers` 
 WHERE (EXISTS (SELECT `orders`.* 
                FROM `orders` 
                WHERE `suppliers`.`id` = `orders`.`supplier_id`))"

Хотя, внутреннее объединение сделало бы это более простым и, в конечном итоге, менее эффективным способом:

Supplier.joins: заказы