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

时间:2017-05-21 10:00:39

标签: ruby-on-rails postgresql activerecord

在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。

(奖励积分:列表也可以是有效/无效的,我只想比较所有有效列表的平均值。)

1 个答案:

答案 0 :(得分:1)

我的建议是从一个简单的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