繁体   English   中英

Rails:“缓存”关联模型值的平均值

[英]Rails: “Caching” the average of an associated model's values

在Rails中,我有一些看起来像这样的模型:

class Product
  has_many :listings
end

class Listing
  belongs_to :product
  # quantity_in_kg
  # total_price
  # price_per_kg = total_price / quantity_in_kg
end

我希望能够根据产品的每公斤价格与产品的每公斤价格进行比较。 例如,此清单的价格仅为每公斤2美元,而产品的平均价格为3美元。

最终,我希望能够运行一个查询,说“给我所有低于其产品平均价格的商品”。

有效的方法是什么? 我正在考虑使用ActiveRecord回调进行自定义,并在products表中缓存每千平均价格,并在listings表中缓存每个列表的每千价格。 可能有很多问题可以解决,所以我想知道是否还有另一种方法。

我正在使用Postgres 9.6和Rails 5.1.0。

(加分点:列表也可以是活跃/不活跃的,我只想比较所有活跃列表的平均值)。

我的建议是从一个简单的after_save回调开始,看看它将带您到哪里。 您可以添加一些更新条件,例如“仅在创建/销毁时重新计算,或者如果active已被更新”,如果您格外小心,则添加一些事务等。

如果太慢,请添加后台工作人员定期进行更新(例如)。

class Listing
  after_save do
    product.update(
      avg_price_per_kg: product.listings.where(active: true).average(:price_per_kg)
    )
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM