How do you do a query that includes a "where exists" in Arel? For example on a query like this to show all the suppliers with at least one order:
SELECT *
FROM suppliers
WHERE EXISTS
(SELECT *
FROM orders
WHERE suppliers.supplier_id = orders.supplier_id);
I see "exists" in the Arel docs http://rubydoc.info/gems/arel/2.0.7/Arel/Nodes/Exists but I'm having trouble using it.
Arel is a SQL AST manager for Ruby. It. simplifies the generation of complex SQL queries, and. adapts to various RDBMSes.
Arel is a SQL abstraction that ActiveRecord uses to build SQL queries. Arel wraps each component of the SQL query language with Ruby objects and provides an expressive DSL for composing SQL queries. When using Arel, you're mainly interacting with tables ( Arel::Table ) and nodes ( Arel::Nodes::Node subclasses).
Here you go:
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`))"
Though, an inner join would do this in a more simple - and eventually less performant - way :
Supplier.joins :orders
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With