[英]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.