2015-05-07 2 views
0

У меня есть Order модели, она имеет много items, это выглядит, как этотКак получить значение суммарной стоимости дочерней модели для рубинов на рельсах?

class Order < ActiveRecord::Base 
    has_many :items 

    def total 
    items.sum('price * quantity') 
    end 
end 

И у меня есть индексный просмотр заказа, запрашивая таблицу заказа, как этого

def index 
    @orders = Order.includes(:items) 
    end 

Тогда, по мнению, я получить доступ к общему порядка, в результате, вы увидите тонн SUM запроса, как этого

SELECT SUM(price * quantity) FROM "items" WHERE "items"."order_id" = $1 [["order_id", 1]] 
SELECT SUM(price * quantity) FROM "items" WHERE "items"."order_id" = $1 [["order_id", 2]] 
SELECT SUM(price * quantity) FROM "items" WHERE "items"."order_id" = $1 [["order_id", 3]] 
... 

Это prett y медленно загружать order.total один за другим, интересно, как я могу загрузить сумму в нетерпеливой манере с помощью одного запроса, но все же я могу получить доступ к order.total, как и раньше.

ответ

0

Попробуйте это:

subquery = Order.joins(:items).select('orders.id, sum(items.price * items.quantity) AS total').group('orders.id') 

@orders = Order.includes(:items).joins("INNER JOIN (#{subquery.to_sql}) totals ON totals.id = orders.id") 

Это создаст подзапрос, который суммирует общее количество заказов, а затем присоединиться к этому подзапрос к вашему другому запросу.

 Смежные вопросы

  • Нет связанных вопросов^_^