Как сделать «где есть» в Ареле - PullRequest
15 голосов
/ 02 июня 2011

Как вы делаете запрос, который включает «где существует» в 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, но у меня возникают проблемы с его использованием.

Ответы [ 2 ]

25 голосов
/ 23 августа 2011

Вот, пожалуйста:

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: заказы

0 голосов
/ 02 июня 2011

Я думаю, что вы можете аккуратно использовать counter_cache для этого:

http://asciicasts.com/episodes/23-counter-cache-column

...