在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。
(奖励积分:列表也可以是有效/无效的,我只想比较所有有效列表的平均值。)
答案 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