【问题标题】:Rails: "Caching" the average of an associated model's valuesRails:“缓存”关联模型值的平均值
【发布时间】:2017-05-21 10:00:38
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord


    【解决方案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
    

    【讨论】:

    • 这听起来像是一个明智的解决方案,谢谢。我想这也需要在after_destroy 上发生,以保持准确。
    猜你喜欢
    • 1970-01-01
    • 2015-04-15
    • 2020-10-07
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多