Итак, у меня есть модель Vendor
и модель Sale
. Запись производится в моей модели продажи, когда заказ отправляется через поставщика.Каков наиболее эффективный способ отслеживать накопленный показатель продаж за всю жизнь?
На моей модели vendor
у меня есть 3 столбца кеша. sales_today
, sales_this_week
, и sales_lifetime
.
Для первых двух, я подсчитал, что-то вроде этого:
def update_sales_today
today = Date.today.beginning_of_day
sales_today = Sale.where("created_at >= ?", today).find_all_by_vendor_id(self.id)
self.sales_today = 0
sales_today.each do |s|
self.sales_today = self.sales_today + s.amount
end
self.save
end
Так что сбрасывает, что значение каждый раз при обращении к нему и пересчитывает на основе его на самых последних записей.
Еженедельный аналогичный, но я использую диапазон дат вместо сегодняшнего дня.
Но ... Я не совсем уверен, как это сделать.
Я не хочу очищать свою стоимость и должен суммировать все Sale.amount
для всех записей о продажах для моего поставщика, каждый раз я обновляю эту запись. Вот почему я даже внедряю кеш в первую очередь.
Каков наилучший способ приблизиться к этому, с точки зрения производительности?
Hrmm ... когда вы сказали 'vendor_sales = Sum.where ...' вы имели в виду 'Sale.where ...'? Этот метод 'sum' выглядит очень интересно. Кстати, мне очень нравится этот подход. Это делает его намного более сухим. – marcamillion
Это замечательно! Не знал, что это существовало. Это так же эффективно, как наличие столбца кэша? – AlexBrand
Я полагаю, что ответ «это зависит». Вероятно, все еще полезно кэшировать результат по столбцу (или где-то еще, например, в Redis и т. Д.). В любом случае я обычно предпочитаю использовать запрос суммы, а не загружать объекты ruby для добавления значений. – rossta