0

所以我有一个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每次更新此记录时都必须汇总我的供应商的所有销售记录。这就是为什么我什至首先要实现缓存。

从性能的角度来看,解决这个问题的最佳方法是什么?

4

2 回答 2

1

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

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")

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

于 2013-04-22T11:21:26.443 回答
0

您可以在销售模型的创建和销毁事件上使用回调:

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
于 2013-04-22T11:21:12.063 回答