Рельсы вычисляют среднее значение по принадлежащему - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть модель покупки, которая относится как к товару, так и к модели. Я пытаюсь сохранить среднюю цену всех покупок, которые делает пользователь, и обновлять это среднее значение при каждом сохранении новой покупки.

Я знаю, что могу просто рассчитать скользящее среднее, но я пытаюсь сделать это, используя метод среднего, предоставленный ActiveRecord. Еще одно предостережение заключается в том, что в этом надуманном примере цена товара равна нулю. Будет ли среднее значение просто игнорировать все экземпляры nil при расчете среднего значения?

Мое основное зависание связано с блоком after_save в Закупках.

class Product < ActiveRecord::Base
    #price   :float

    has_many :purchases
end

class User < ActiveRecord::Base
    #average_purchase_price  :float

    has_many :purchases
end

class Purchase < ActiveRecord::Base
    belongs_to :user
    belongs_to :product

    after_save do
       #Cant quite nail down the syntax here.
       user.update_attributes average_purchase_price: user.purchases.average(#todo average purchase prices)
    end
end

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Сгенерированный запрос: SELECT AVG (average_purchase_price) ОТ покупок ... (см. Это: http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html#M000293).

Если вы посмотрите документацию mysql по групповым функциям (http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html), в нем говорится, что ноль)значения игнорируются, если явно не указано. Так что да, значения nil будут игнорироваться.

0 голосов
/ 01 февраля 2012

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

user.update_attribute(:average_purchase_price, 
  user.purchases.average("products.price", :joins => :product)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...