2015-11-26 2 views
0

У меня есть модель, которая содержит предметы для продажи. Модель зеркалирует API, поэтому я не могу изменить ее структуру.ActiveRecord sum

В этой модели у меня есть поля price и sold_quantity.

Неправильно перебирать запрос с помощью цикла.

current_user.items.each do |item| 
    total += item.price * item.sold_quantity 
end 

Есть ли способ, чтобы получить тот же итог, используя только ActiveRecord? Как .sum(:price), но умножение на sold_quantity?

+0

Только что нашел лучший способ, чем уродливая петля, но он по-прежнему выполняет итерации по результатам. В этом разделе http://stackoverflow.com/questions/25274845/rails-4-sum-by-model-method Я нашел способ суммирования методом экземпляра модели '@ items.to_a.sum (&: sold_value)' – goo

ответ

3

Вы, наверное, хотите:

current_user.items 
    .select('items.*, items.price * items.sold AS total') 
    .all 

Или, если вы хотите, итоги и ничего:

current_user.items.pluck('items.price * items.sold') 
+0

'pluck' именно то, что я искал http://apidock.com/rails/ActiveRecord/Calculations/pluck – goo

+0

Это действительно сработало, но оно возвращает массив, содержащий результаты всех умножений. Просто добавьте '.inject (: +)' – goo

+0

current_user.items.pluck ('items.price * items.sold'). Inject (: +) – goo

1

Вы можете сделать это:

current_user.items.sum { |item| item.price * item.sold_quantity } 

Я надеюсь, что это поможет вы.

Для получения дополнительной информации sum в AR

+2

Здесь вы не используете ActiveRecord. Метод, который вы используете (и связанный с ним), - это перечисляемая сумма из ActiveSupport. –

1

Одним из способов вы могли бы подойти к этому были бы переместить эту логику в Пункте класс:

class Item < ActiveRecord::Base 
    ... 

    def total 
    self.price * self.sold_quantity 
    end 

    def self.sold_value 
    all.map{|a| a.total}.sum 
    end 
end 

Здесь каждый экземпляр элемента вычисляет его собственные общее и метод класса позволяет получить проданную стоимость в любой коллекции предметов.

@user.items.sold_value 
Смежные вопросы