什么是跟踪累计终身销售数字的最有效方法?

时间:2013-04-22 09:41:05

标签: ruby-on-rails ruby-on-rails-3 counter-cache

所以我有一个Vendor模型和一个Sale模型。每当通过供应商下订单时,我的销售模型中都会生成一个条目。

在我的vendor模型上,我有3个缓存列。 sales_todaysales_this_weeksales_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

因此,每次访问该值时都会重置该值,并根据最新记录重新计算该值。

每周一次很相似,但我使用的是一系列日期,而不是今天。

但是......我不太确定如何使用Lifetime数据。

我不想清除我的价值,并且每次更新此记录时都必须为我的供应商的所有销售记录加上所有Sale.amount。这就是我甚至首先实现缓存的原因。

从绩效角度来看,最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

在这种情况下,我可能会使用ActiveRecord的sum方法(docs)。一体化:

today = Date.today
vendor_sales = Sale.where(:vendor_id => self.id)

self.sales_today =     vendor_sales.
                        where("created_at >= ?", today.beginning_of_day).
                        sum("amount")

self.sales_this_week = vendor_sales.
                        where("created_at >= ?", today.beginning_of_week).
                        sum("amount")

self.sales_lifetime = vendor_sales.sum("amount")

这意味着您不必在内存中加载大量销售对象来添加金额。

答案 1 :(得分:0)

您可以对Sales模型的create和destroy事件使用回调:

class SalesController < ApplicationController

    after_save :increment_vendor_lifetime_sales
    before_destroy :decrement_vendor_lifetime_sales

    def increment_vendor_lifetime_sales
        vendor.update_attribute :sales_lifetime, vendor.sales_lifetime + amount
    end

    def decrement_vendor_lifetime_sales
        vendor.update_attribute :sales_lifetime, vendor.sales_lifetime - amount
    end
end