所以我有一个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
因此,每次访问该值时都会重置该值,并根据最新记录重新计算该值。
每周一次很相似,但我使用的是一系列日期,而不是今天。
但是......我不太确定如何使用Lifetime数据。
我不想清除我的价值,并且每次更新此记录时都必须为我的供应商的所有销售记录加上所有Sale.amount
。这就是我甚至首先实现缓存的原因。
从绩效角度来看,最好的方法是什么?
答案 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